20

我正在尝试创建一个使用连接的 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' ) 

这看起来没问题。但是生成的剪辑模型数组包含一个 ID 不在数据库中的剪辑 - 它取而代之的是一个节目 ID。我哪里错了?

4

2 回答 2

26

问题是“SELECT *” - 查询按顺序从剪辑、系列和节目中提取所有列。每个表都有一个 id 列,并导致结果中命名列之间的冲突。拉回的最后一个 id 列(从节目中)覆盖了您想要的那个。您应该在 :joins 中使用 :select 选项,例如:

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' "
}
于 2008-10-03T10:56:23.723 回答
5

这是一个错误:

http://rails.lighthouseapp.com/projects/8994/tickets/1077-chaining-scopes-with-duplicate-joins-causes-alias-problem

于 2008-10-03T10:32:51.960 回答