From 8b30302f3b7eabe967b16e78f898759bce37ff0c Mon Sep 17 00:00:00 2001 From: hoshitocat Date: Sun, 12 Jul 2015 14:58:38 +0900 Subject: [PATCH] Fix handle attribute-names-including test failure --- lib/ransack/nodes/condition.rb | 10 +++++++--- spec/ransack/adapters/active_record/base_spec.rb | 7 +------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/ransack/nodes/condition.rb b/lib/ransack/nodes/condition.rb index 3858741..bb15d07 100644 --- a/lib/ransack/nodes/condition.rb +++ b/lib/ransack/nodes/condition.rb @@ -9,7 +9,7 @@ module Ransack 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 @@ module Ransack 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 4758700..304f791 100644 --- a/spec/ransack/adapters/active_record/base_spec.rb +++ b/spec/ransack/adapters/active_record/base_spec.rb @@ -228,14 +228,9 @@ module Ransack 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