带有连接的Rails named_scopes
时间:2020-03-06 15:04:03 来源:igfitidea点击:
我正在尝试创建一个使用联接的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=>"shows.visible = 1 AND clips.owner_type = 'Series' " }
(剪辑由一个系列拥有,一个系列属于一个节目,一个节目可以是可见的也可以是不可见的)。
Clip.all可以:
SELECT * FROM `clips`
Clip.visible.all可以:
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' )
看起来还可以。但是,由此产生的Clip模型数组包含一个ID不在数据库中的Clip,因此它选择了一个Show ID。我要去哪里错了?
解决方案
这是一个错误:
http://rails.lighthouseapp.com/projects/8994/tickets/1077-chaining-scopes-with-duplicate
导致别名问题
问题是" SELECT *"查询以该顺序从剪辑,系列和显示中拾取所有列。每个表都有一个id列,并导致结果中命名列之间的冲突。从显示中撤回的最后一个id列将覆盖我们想要的列。我们应该将:select选项与:joins一起使用,例如:
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' " }