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