Rails在不同的动态范围内两次连接同一张表

悄悄

我在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获取记录后应用过滤器来完成此操作。但是有没有办法仅在使用AREL的sql中做到这一点?

准备好

我同意@zapico-使用范围。而且您必须使用Lambda,因为List.good_list_idsList.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) }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章