Ruby on rails 名为_的Rails作用域与连接
我试图创建一个使用联接的命名范围,但尽管生成的SQL看起来正确,结果却是垃圾。例如:Ruby on rails 名为_的Rails作用域与连接,ruby-on-rails,ruby,activerecord,named-scope,Ruby On Rails,Ruby,Activerecord,Named Scope,我试图创建一个使用联接的命名范围,但尽管生成的SQL看起来正确,结果却是垃圾。例如: class Clip < ActiveRecord::Base named_scope :visible, { :joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id", :conditions=>"show
class Clip < ActiveRecord::Base
named_scope :visible, {
:joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id",
:conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
}
Clip.visible.all执行以下操作:
SELECT * FROM `clips`
SELECT * FROM `clips` INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id WHERE (shows.visible = 1 AND clips.owner_type = 'Series' )
这看起来不错。但是,生成的剪辑模型数组包含一个ID不在数据库中的剪辑,它取而代之的是一个show ID。我哪里出错了?这是一个错误:
问题在于“选择*”—查询将按照该顺序从剪辑、系列和显示中选取所有列。每个表都有一个id列,这会导致结果中的命名列之间发生冲突。(从显示中)向后拉的最后一个id列将覆盖所需的id列。您应该将:选择选项与:联接一起使用,如:
named_scope :visible, {
:select => "episodes.*",
:joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id",
:conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
}