Ruby on rails 查找没有多个记录的记录:通过记录匹配条件

Ruby on rails 查找没有多个记录的记录:通过记录匹配条件,ruby-on-rails,activerecord,rails-activerecord,has-many-through,Ruby On Rails,Activerecord,Rails Activerecord,Has Many Through,使用Rails 4,并提供以下型号: class Draft < ActiveRecord::Base has_many :drafters has_many :users, through: :drafters end class Drafter < ActiveRecord::Base belongs_to :draft belongs_to :user end class User < ActiveRecord::Base has_many :dr

使用Rails 4,并提供以下型号:

class Draft < ActiveRecord::Base
  has_many :drafters
  has_many :users, through: :drafters
end

class Drafter < ActiveRecord::Base
  belongs_to :draft
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :drafters
  has_many :drafts, through: :drafters
end
类草稿
如何检索与用户实例未关联的所有草稿?也就是说,所有草稿
d
,其中没有属于
d
当前用户的起草人


如果有帮助的话,我可以使用。

您可以使用
包括
来实现它:

Draft.includes(:drafters)
     .where('(drafters.user_id <> ? or drafters.user_id is null)', current_user.id})
     .references(:drafters)
Draft.包括(:起草人)
.where(‘(drafters.user_id?或drafters.user_id为空)’,当前_user.id})
.参考文件(:起草人)

您可以使用
包含来实现它:

Draft.includes(:drafters)
     .where('(drafters.user_id <> ? or drafters.user_id is null)', current_user.id})
     .references(:drafters)
Draft.包括(:起草人)
.where(‘(drafters.user_id?或drafters.user_id为空)’,当前_user.id})
.参考文件(:起草人)
将返回所有草稿,但根本没有起草人

Draft.includes(:drafters).where.not(:drafter => { user_id => current_user.od })
将返回不属于当前用户的所有草稿

有关更多详细信息,请参阅

将返回所有草稿,但根本没有起草人

Draft.includes(:drafters).where.not(:drafter => { user_id => current_user.od })
将返回不属于当前用户的所有草稿


有关更多详细信息,请参阅。

使用Squeel,您可以执行以下操作:

Draft.joins{drafters.outer}.where{(drafters.user_id != current_user.id) | (drafters.user_id.eq nil)}
这将产生:

SELECT "drafts".* FROM "drafts" LEFT OUTER JOIN "drafters" ON "drafters"."draft_id" = "drafts"."id" WHERE ("drafters"."user_id" != 1 OR "drafters"."user_id" IS NULL)

使用squel,您可以执行以下操作:

Draft.joins{drafters.outer}.where{(drafters.user_id != current_user.id) | (drafters.user_id.eq nil)}
这将产生:

SELECT "drafts".* FROM "drafts" LEFT OUTER JOIN "drafters" ON "drafters"."draft_id" = "drafts"."id" WHERE ("drafters"."user_id" != 1 OR "drafters"."user_id" IS NULL)
我根据以下嵌套查询找到了答案(使用squel):

SELECT "drafts"."id" FROM "drafts"
    WHERE "drafts"."id" NOT IN 
        (SELECT "drafters"."draft_id" FROM "drafters" 
            WHERE (("drafters"."draft_id" = "drafters"."id" 
                    AND "drafters"."user_id" = 2)))
可转换为Rails+squel查询:

Draft.where{ id.not_in(Drafter.select(:draft_id).where{
        (draft_id == drafts.id) & (user_id == omit_user_id)})}
我根据以下嵌套查询找到了答案(使用squel):

SELECT "drafts"."id" FROM "drafts"
    WHERE "drafts"."id" NOT IN 
        (SELECT "drafters"."draft_id" FROM "drafters" 
            WHERE (("drafters"."draft_id" = "drafters"."id" 
                    AND "drafters"."user_id" = 2)))
可转换为Rails+squel查询:

Draft.where{ id.not_in(Drafter.select(:draft_id).where{
        (draft_id == drafts.id) & (user_id == omit_user_id)})}

这不太管用。首先,它没有发现那些根本没有起草人的草案。其次,使用它会产生一个弃用:
弃用警告:看起来您急于加载字符串SQL代码段中引用的表(草稿、起草者之一)。
-full text@Chowlett:Updated<代码>引用
删除弃用警告(即强制
左连接
),而
为空
检查允许没有起草人的草稿。哇。这比我想象的要难看得多。它为什么有效?生成的SQL是DraftDrafter上的左外部联接,因此应该在缺少Drafter侧的行中显示。为什么我需要
drafters.user\u id为null
来处理
Drafter.draft\u id
上没有草稿行匹配的情况?…不,将其更改为
draft.joins…
返回到没有草稿的草稿缺失问题。在psql中,我现在理解了原因。首先,WHERE不影响连接,它只是过滤结果。第二个NULL总是比较false。也就是说,(NULL 1)为false。谢谢这不太管用。首先,它没有发现那些根本没有起草人的草案。其次,使用它会产生一个弃用:
弃用警告:看起来您急于加载字符串SQL代码段中引用的表(草稿、起草者之一)。
-full text@Chowlett:Updated<代码>引用
删除弃用警告(即强制
左连接
),而
为空
检查允许没有起草人的草稿。哇。这比我想象的要难看得多。它为什么有效?生成的SQL是DraftDrafter上的左外部联接,因此应该在缺少Drafter侧的行中显示。为什么我需要
drafters.user\u id为null
来处理
Drafter.draft\u id
上没有草稿行匹配的情况?…不,将其更改为
draft.joins…
返回到没有草稿的草稿缺失问题。在psql中,我现在理解了原因。首先,WHERE不影响连接,它只是过滤结果。第二个NULL总是比较false。也就是说,(NULL 1)为false。谢谢我尝试了这个,但最终发现它返回了多个草稿,其中有多个非当前用户起草者。
includes
方法似乎是唯一可行的方法。我尝试了这个方法,但最终发现它返回了多个草稿,其中有多个非当前用户的起草者。
includes
方法似乎是唯一的选择。