Module: Globalize::ActiveRecord::QueryMethods

Defined in:
lib/globalize/active_record/query_methods.rb

Defined Under Namespace

Classes: WhereChain

Instance Method Summary collapse

Instance Method Details

#exists?(conditions = :none) ⇒ Boolean

Returns:

  • (Boolean)


32
33
34
35
36
37
38
# File 'lib/globalize/active_record/query_methods.rb', line 32

def exists?(conditions = :none)
  if parsed = parse_translated_conditions(conditions)
    with_translations_in_fallbacks.exists?(parsed)
  else
    super
  end
end

#join_translations(relation = self) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/globalize/active_record/query_methods.rb', line 69

def join_translations(relation = self)
  if relation.joins_values.include?(:translations)
    relation
  else
    relation.with_translations_in_fallbacks
  end
end

#order(opts, *rest) ⇒ Object



24
25
26
27
28
29
30
# File 'lib/globalize/active_record/query_methods.rb', line 24

def order(opts, *rest)
  if respond_to?(:translated_attribute_names) && parsed = parse_translated_order(opts)
    join_translations super(parsed)
  else
    super
  end
end

#parse_translated_conditions(opts) ⇒ Object



44
45
46
47
48
49
50
# File 'lib/globalize/active_record/query_methods.rb', line 44

def parse_translated_conditions(opts)
  if opts.is_a?(Hash) && respond_to?(:translated_attribute_names) && (keys = opts.symbolize_keys.keys & translated_attribute_names).present?
    opts = opts.dup
    keys.each { |key| opts[translated_column_name(key)] = opts.delete(key) || opts.delete(key.to_s) }
    opts
  end
end

#where(opts = :chain, *rest) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/globalize/active_record/query_methods.rb', line 14

def where(opts = :chain, *rest)
  if opts == :chain
    WhereChain.new(spawn)
  elsif parsed = parse_translated_conditions(opts)
    join_translations(super(parsed, *rest))
  else
    super
  end
end

#where_values_hash(*args) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/globalize/active_record/query_methods.rb', line 53

def where_values_hash(*args)
  return super unless respond_to?(:translations_table_name)
  equalities = respond_to?(:with_default_scope) ? with_default_scope.where_values : where_values
  equalities = equalities.grep(Arel::Nodes::Equality).find_all { |node|
    node.left.relation.name == translations_table_name
  }

  binds = Hash[bind_values.find_all(&:first).map { |column, v| [column.name, v] }]

  super.merge(Hash[equalities.map { |where|
    name = where.left.name
    [name, binds.fetch(name.to_s) { right = where.right; right.is_a?(Arel::Nodes::Casted) ? right.val : right }]
  }])
end

#with_translations_in_fallbacksObject



40
41
42
# File 'lib/globalize/active_record/query_methods.rb', line 40

def with_translations_in_fallbacks
  with_translations(Globalize.fallbacks)
end