Sha256: 85de5081a6bd99c8b4a838da76b250f5f17906078bb59dc6823c4bd9cfb3c81b
Contents?: true
Size: 1.78 KB
Versions: 1
Compression:
Stored size: 1.78 KB
Contents
module Vapid module Directives # Group directive class Group < Vapid::Directive FILTER_METHODS = [:limit, :order].freeze renders :all before_render do Models::Group.named(subject).try(:records) end # Filters filter :repeat do |query, limit| query.limit(limit) end # @todo This is a hack to allow all supported ActiveRecord databases to # use/search/order by JSON. Ideally, we'd look for the JSON capabilities # of the host DB, and adjust the implementation accordingly. filter :order do |query, args| fields, desc_indexes = parse_conditions(args) values = fetch_values(query, fields) sorted_values = sort_values(values, desc_indexes) statement = sorted_values.map { |v| "ID=#{v[0]} DESC" }.join(", ") query.order(statement) end def repeating? @args.any? { |a| a.first == "repeat" } end private def parse_conditions(args) fields = [] desc_indexes = [] conditions = args.scan(/(-)?(\w+)/) conditions.each_with_index do |(sign, field), i| fields << field desc_indexes << i if sign == "-" end [fields, desc_indexes] end def fetch_values(query, fields) query.unscope(FILTER_METHODS).each_with_object({}) do |record, values| values[record.id] = record.content.values_at(*fields) end end def sort_values(values, desc_indexes) values.sort do |a, b| x = a[1] y = b[1] desc_indexes.each do |i| orig = x[i] x[i] = y[i] y[i] = orig end x <=> y end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
vapid-0.1.0 | lib/vapid/directives/group.rb |