diff --git a/lib/ransack/nodes/condition.rb b/lib/ransack/nodes/condition.rb index 385874135..c47d3bdbe 100644 --- a/lib/ransack/nodes/condition.rb +++ b/lib/ransack/nodes/condition.rb @@ -9,7 +9,7 @@ class Condition < Node class << self def extract(context, key, values) - attributes, predicate = extract_attributes_and_predicate(key) + attributes, predicate = extract_attributes_and_predicate(key, context) if attributes.size > 0 && predicate combinator = key.match(/_(or|and)_/) ? $1 : nil condition = self.new(context) @@ -31,14 +31,18 @@ def extract(context, key, values) private - def extract_attributes_and_predicate(key) + def extract_attributes_and_predicate(key, context = nil) str = key.dup name = Predicate.detect_and_strip_from_string!(str) predicate = Predicate.named(name) unless predicate || Ransack.options[:ignore_unknown_conditions] raise ArgumentError, "No valid predicate for #{key}" end - attributes = str.split(/_and_|_or_/) + if context.present? && context.attribute_method?(str) + attributes = [str] + else + attributes = str.split(/_and_|_or_/) + end [attributes, predicate] end end diff --git a/spec/ransack/adapters/active_record/base_spec.rb b/spec/ransack/adapters/active_record/base_spec.rb index 475870021..304f79143 100644 --- a/spec/ransack/adapters/active_record/base_spec.rb +++ b/spec/ransack/adapters/active_record/base_spec.rb @@ -228,14 +228,9 @@ def self.sane_adapter? end it "should function correctly when an attribute name has 'and' in it" do - # FIXME: this test does not pass! p = Person.create!(:terms_and_conditions => true) s = Person.ransack(:terms_and_conditions_eq => true) - # search is not detecting the attribute - puts " - FIXME: Search not detecting the `terms_and_conditions` attribute in - base_spec.rb, line 178: #{s.result.to_sql}" - # expect(s.result.to_a).to eq [p] + expect(s.result.to_a).to eq [p] end it 'allows sort by "only_sort" field' do