From 8ef09b4c39d2b95645674a5b62bce50859cf966e Mon Sep 17 00:00:00 2001 From: Nathaniel Williams Date: Thu, 31 Dec 2015 10:35:49 -0600 Subject: [PATCH] prefix position_column w/ table name in higher/lower item queries Joining the relation returned by `#higher_items` or `#lower_items` to a table also having `position_column` would result in an ambiguous column error --- lib/acts_as_list/active_record/acts/list.rb | 8 +-- test/test_joined_list.rb | 64 +++++++++++++++++++++ 2 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 test/test_joined_list.rb diff --git a/lib/acts_as_list/active_record/acts/list.rb b/lib/acts_as_list/active_record/acts/list.rb index fc3bc835..584d1f04 100644 --- a/lib/acts_as_list/active_record/acts/list.rb +++ b/lib/acts_as_list/active_record/acts/list.rb @@ -255,8 +255,8 @@ def higher_items(limit=nil) limit ||= acts_as_list_list.count position_value = send(position_column) acts_as_list_list. - where("#{position_column} < ?", position_value). - where("#{position_column} >= ?", position_value - limit). + where("#{acts_as_list_class.table_name}.#{position_column} < ?", position_value). + where("#{acts_as_list_class.table_name}.#{position_column} >= ?", position_value - limit). limit(limit). order("#{quoted_table_name}.#{quoted_position_column} ASC") end @@ -273,8 +273,8 @@ def lower_items(limit=nil) limit ||= acts_as_list_list.count position_value = send(position_column) acts_as_list_list. - where("#{position_column} > ?", position_value). - where("#{position_column} <= ?", position_value + limit). + where("#{acts_as_list_class.table_name}.#{position_column} > ?", position_value). + where("#{acts_as_list_class.table_name}.#{position_column} <= ?", position_value + limit). limit(limit). order("#{quoted_table_name}.#{quoted_position_column} ASC") end diff --git a/test/test_joined_list.rb b/test/test_joined_list.rb new file mode 100644 index 00000000..680223c0 --- /dev/null +++ b/test/test_joined_list.rb @@ -0,0 +1,64 @@ +require 'helper' + +ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") +ActiveRecord::Schema.verbose = false + +class Section < ActiveRecord::Base + has_many :items + acts_as_list + + scope :visible, -> { where(visible: true) } +end + +class Item < ActiveRecord::Base + belongs_to :section + acts_as_list scope: :section + + scope :visible, -> { where(visible: true).joins(:section).merge(Section.visible) } +end + +class JoinedTestCase < Minitest::Test + def setup + ActiveRecord::Base.connection.create_table :sections do |t| + t.column :position, :integer + t.column :visible, :boolean, default: true + end + + ActiveRecord::Base.connection.create_table :items do |t| + t.column :position, :integer + t.column :section_id, :integer + t.column :visible, :boolean, default: true + end + + ActiveRecord::Base.connection.schema_cache.clear! + [Section, Item].each(&:reset_column_information) + super + end + + def teardown + ActiveRecord::Base.connection.tables.each do |table| + ActiveRecord::Base.connection.drop_table(table) + end + super + end +end + +# joining the relation returned by `#higher_items` or `#lower_items` to another table +# previously could result in ambiguous column names in the query +class TestHigherLowerItems < JoinedTestCase + def test_higher_items + section = Section.create + item1 = Item.create section: section + item2 = Item.create section: section + item3 = Item.create section: section + assert_equal item3.higher_items.visible, [item1, item2] + end + + def test_lower_items + section = Section.create + item1 = Item.create section: section + item2 = Item.create section: section + item3 = Item.create section: section + assert_equal item1.lower_items.visible, [item2, item3] + end +end