【问题标题】:Rails named_scopes with joins带有连接的 Rails named_scopes
【发布时间】:2010-09-15 00:55:15
【问题描述】:

我正在尝试创建一个使用连接的 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。我哪里错了?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord named-scope


    【解决方案1】:

    问题在于“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' "
    }
    

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多