Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在不同动态范围下两次连接同一表的Rails_Mysql_Ruby On Rails_Ruby_Arel - Fatal编程技术网

Mysql 在不同动态范围下两次连接同一表的Rails

Mysql 在不同动态范围下两次连接同一表的Rails,mysql,ruby-on-rails,ruby,arel,Mysql,Ruby On Rails,Ruby,Arel,我在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, :foreig

我在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}
当前,当应用程序启动时,条件被缓存,但我希望它是动态的,因为
好的列表\u id
坏的列表\u id
可以更改运行时间。我希望能够通过链接联接找到与这两个列表关联的书籍。例如,如果
good\u list\u id=[1,2,3]
bad\u list\u id=[4,5,6]
。我想获取与至少一个
好列表\u ID
和至少一个
坏列表\u ID
关联的书籍

Book.joins(:good_lists).joins(:bad_lists)

我知道在从数据库中获取记录后,可以通过应用过滤器来实现。但是有没有一种方法只能在使用AREL的sql中实现这一点呢?

我同意@zapico-use scopes。您必须使用Lambda,因为
List.good\u List\u id
List.bad\u List\u id
是动态的

#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
如果你想让记录属于好名单或坏名单,那么在我看来,最简单的方法是

# join arrays
scope :good_bad_lists, -> { joins(:lists).where('lists.id IN (?)', List.good_list_ids | List.bad_list_ids) }

好列表ID和坏列表ID的数据类型是什么?它们是列表ID的数组。这些阵列由其他后台进程定期更新。我认为使用两个作用域会更好地解决您的问题,您考虑过吗?@zapico您能建议一下作用域的外观吗。我已经考虑过了,但不知道如何让它们具有动态条件和可链接性,因为它们依赖于相同的关联。它适用于动态条件,但在链接作用域时,它会与在好数组和坏数组中都有ID的列表(空值)相连接。我想要有好的和坏的清单相关联的书。用一个例子更新了问题。@tihom您是否尝试询问“uniq”值??Book.bad_list.good_list.uniq这个问题通过示例得到了改进,现在很明显,问题是要得到bad_list还是good_list。链接作用域在SQL查询中提供了操作数
,因此最简单的方法是通过连接这些列表(坏列表+好列表)来编写一个作用域。答案已经更新。