【问题标题】:Rails scope: association is nilRails 范围:关联为零
【发布时间】:2015-06-25 15:28:54
【问题描述】:

在我的 Rails 应用中,项目可以包含视频。我想为项目创建一个范围,以抓取没有与它相关联的视频的项目。我该怎么做?

这是我的模型关联

class Project < ActiveRecord::Base
  has_one :video
end

class Video < ActiveRecord::Base
    belongs_to :project
end

【问题讨论】:

标签: ruby-on-rails scope associations


【解决方案1】:

我认为这应该可行:Project.where.not(id: Video.select(:project_id).uniq)。如果一个项目有一个独特的视频,也许你不需要uniq

【讨论】:

    【解决方案2】:

    你应该试试这个 Project.joins(:video).where('videos.id IS NULL')

    【讨论】:

    • 这将始终返回一个空集,因为 joins(:video) 在 vi​​deos.id 上使用了 INNER 连接,因此“videos.id IS NULL”将不匹配任何记录。
    【解决方案3】:

    使用 LEFT 连接并选择连接 id 为空的行。

    Project.joins("LEFT JOIN videos ON videos.project_id = projects.id").
      where("videos.id IS NULL")
    

    【讨论】:

      【解决方案4】:

      现在刚刚遇到这个问题,这对我有用:

      Project.includes(:video).where(videos: { id: nil })
      

      诀窍是在includes 中使用单数,在where 中使用复数

      【讨论】:

        【解决方案5】:

        根据 messanjah 的回答,您将其转换为范围的方式如下:

        class Project < ActiveRecord::Base
          has_one :video
          scope :videoless, -> { left_joins(:videos).where("videos.id IS NULL") }
        end
        
        class Video < ActiveRecord::Base
          belongs_to :project
        end
        

        【讨论】:

          猜你喜欢
          • 2013-06-09
          • 1970-01-01
          • 2016-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多