【问题标题】:Find all records NOT in a many-to-many association查找不在多对多关联中的所有记录
【发布时间】:2011-01-22 17:42:30
【问题描述】:

在带有 ActiveRecord 的 Rails 3 中,我有 2 个模型(用户和任务)。这些模型通过一个 has_many 链接在一起:通过在另一个模型上的关联,Assignments。如何找到与特定用户无关的所有任务?

class User < ActiveRecord::Base
  has_many :assignments
  has_many :tasks, :through => :assignments
end

class Tasks < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments
end

class Assignments < ActiveRecord::Base
  belongs_to :users
  belongs_to :tasks
end

【问题讨论】:

  • 您真的在寻找 SQL 答案吗?如果没有,也许您可​​以考虑删除该标签。否则,我可以为您提供执行此操作的 SQL。
  • 第二次 emtucifor 的评论。 SQL 是微不足道的。你想要 SQL 吗?
  • 这不是我想要的,但我认为这可能是唯一的方法。所以是的,我会使用 SQL。
  • 非sql解决方案也很简单:Task.all - user.tasks
  • 或者:Task.where('id not in (?)', user.task_ids)

标签: sql ruby-on-rails activerecord


【解决方案1】:

短而甜:

Task.all - user.tasks

避免加载用户任务:

Task.where('id not in (?)', user.task_ids)

我不知道如何在 AR 中使用外连接。

【讨论】:

    【解决方案2】:

    我将假设您想要那些没有任何关联用户的任务,而不是不与特定用户关联。

    Tasks.joins('left outer join assignments on assignments.task_id = tasks.id').where('assignments.* is null')
    

    【讨论】:

    • 不应该是左外连接吗?
    • 是的,你是对的,谢谢 noodl。我现在无法测试任何东西,所以不应该猜测。
    • 谢谢马克!您的解决方案节省了大量时间!
    • SQLite3 通配符有问题,抛出"ActiveRecord::StatementInvalid: SQLite3::SQLException: near "*"。片段'assignments.id is null' 有效。 (与关联记录应为非空的任何字段。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多