class Mobility::Plugins::Sequel::Query::VirtualRow

Internal class to create 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/sequel/query.rb, line 72
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 ::Sequel::Dataset === query
    predicates = query.opts[:where]
    prepare_datasets(query, row.backends, row.locales, predicates)
  else
    prepare_datasets(klass.dataset, row.backends, row.locales, query).where(query)
  end
end
new(model_class, global_locale) click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 53
def initialize(model_class, global_locale)
  @model_class, @global_locale, @backends, @locales = model_class, global_locale, [], []
end

Private Class Methods

prepare_datasets(dataset, backends, locales, predicates) click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 88
def prepare_datasets(dataset, backends, locales, predicates)
  backends.inject(dataset) do |dataset_, b|
    locales.inject(dataset_) do |ds, locale|
      b.prepare_dataset(ds, predicates, locale)
    end
  end
end

Public Instance Methods

method_missing(m, *args) click to toggle source
Calls superclass method
# File lib/mobility/plugins/sequel/query.rb, line 57
def method_missing(m, *args)
  if @model_class.mobility_attribute?(m)
    @backends |= [@model_class.mobility_backend_class(m)]
    ::Mobility.validate_locale!(args[0]) if args[0]
    locale = args[0] || @global_locale
    @locales |= [locale]
    @model_class.mobility_backend_class(m).build_op(m.to_s, locale)
  elsif @model_class.columns.include?(m.to_s)
    ::Sequel::SQL::QualifiedIdentifier.new(@model_class.table_name, m)
  else
    super
  end
end