class Mobility::Plugins::ActiveRecord::Query::VirtualRow
Creates a “clean room” for manipulating translated attribute nodes in an instance-eval'ed block. Inspired by Sequel's (much more sophisticated) virtual rows.
Attributes
backends[R]
locales[R]
Public Class Methods
build_query(klass, locale, &block)
click to toggle source
# File lib/mobility/plugins/active_record/query.rb, line 101 def build_query(klass, locale, &block) ::Mobility.validate_locale!(locale) row = new(klass, locale) query = block.arity.zero? ? row.instance_eval(&block) : block.call(row) if ::ActiveRecord::Relation === query predicates = query.arel.constraints apply_scopes(klass.all, row.backends, row.locales, predicates).merge(query) else apply_scopes(klass.all, row.backends, row.locales, query).where(query) end end
new(klass, global_locale)
click to toggle source
# File lib/mobility/plugins/active_record/query.rb, line 82 def initialize(klass, global_locale) @klass, @global_locale, @locales, @backends = klass, global_locale, [], [] end
Private Class Methods
apply_scopes(scope, backends, locales, predicates)
click to toggle source
# File lib/mobility/plugins/active_record/query.rb, line 117 def apply_scopes(scope, backends, locales, predicates) backends.inject(scope) do |scope_, b| locales.inject(scope_) do |r, locale| b.apply_scope(r, predicates, locale) end end end
Public Instance Methods
method_missing(m, *args)
click to toggle source
Calls superclass method
# File lib/mobility/plugins/active_record/query.rb, line 86 def method_missing(m, *args) if @klass.mobility_attribute?(m) @backends |= [@klass.mobility_backend_class(m)] ::Mobility.validate_locale!(args[0]) if args[0] locale = args[0] || @global_locale @locales |= [locale] @klass.mobility_backend_class(m).build_node(m, locale) elsif @klass.column_names.include?(m.to_s) @klass.arel_table[m] else super end end