我在Rails 3.0.1中有一个应用程序。有一个名为Books的表有很多列表。我根据列表是好列表还是坏列表来与列表进行条件关联。
#Book.rb
has_many :lists
has_many :good_lists, :foreign_key => 'book_id', :class_name => "List", :conditions => {:id => List.good_list_ids}
has_many :bad_lists, :foreign_key => 'book_id', :class_name => "List", :conditions => {:id => List.bad_list_ids}
目前,当应用程序启动时会缓存条件,但我希望它是动态的,因为good_list_ids
和bad_list_ids
可以更改运行时。我希望能够通过链接连接找到与这两个列表相关联的书籍。例如,如果good_lists_ids = [1,2,3]
和bad_lists_ids = [4,5,6]
。我希望获得与至少一个good_list_ids
和至少一个bad_list_ids
相关联的图书。
Book.joins(:good_lists).joins(:bad_lists)
我知道可以通过从db获取记录后应用过滤器来完成。但有没有办法只在sql中使用AREL?
答案 0 :(得分:3)
我同意@zapico - 使用范围。您必须使用Lambda,因为List.good_list_ids
和List.bad_list_ids
是动态的。
#Book.rb
has_many :lists
scope :good_lists, -> { joins(:lists).where('lists.id IN (?)', List.good_list_ids) }
scope :bad_lists, -> { joins(:lists).where('lists.id IN (?)', List.bad_list_ids) }
<强>更新强>
现在你可以获得这些列表中的书籍
# in bad list
Book.bad_lists
# in good list
Book.good_lists
# in both lists (this is intersection! for these lists)
Book.bad_lists.good_lists
如果您希望记录属于good_list或bad_list,那么在我看来最简单的方法是
# join arrays
scope :good_bad_lists, -> { joins(:lists).where('lists.id IN (?)', List.good_list_ids | List.bad_list_ids) }