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)


35
36
37
38
39
40
41
# File 'lib/globalize/active_record/query_methods.rb', line 35

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

#join_translations(relation = self, opts = {}) ⇒ Object



82
83
84
85
86
87
88
89
# File 'lib/globalize/active_record/query_methods.rb', line 82

def join_translations(relation = self, opts = {})
  if relation.joins_values.include?(:translations)
    rel = relation
  else
    rel = relation.with_translations_in_fallbacks
  end
  rel.with_where(opts)
end

#order(opts, *rest) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/globalize/active_record/query_methods.rb', line 27

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



58
59
60
61
62
63
64
# File 'lib/globalize/active_record/query_methods.rb', line 58

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

#translated_vs_normal(opts) ⇒ Object



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

def translated_vs_normal(opts)
  translated = {}
  if opts.is_a?(Hash) && respond_to?(:translated_attribute_names) && (opts.symbolize_keys.keys & translated_attribute_names).present?
    opts = opts.dup
    opts.each do |k,v|
        translated[k] = opts.delete(k) || opts.delete(key.to_s) if translated_column? k.to_sym
    end
  end
  return translated, opts
end

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



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

def where(opts = :chain, *rest)
  if opts == :chain
    WhereChain.new(spawn)
  else
    translated, normal = translated_vs_normal(opts)
    if not translated.empty?
      join_translations(super(normal, *rest), translated)
    else
      super
    end
  end
end

#where_values_hash(*args) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/globalize/active_record/query_methods.rb', line 66

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



54
55
56
# File 'lib/globalize/active_record/query_methods.rb', line 54

def with_translations_in_fallbacks
  with_translations(Globalize.fallbacks)
end