Rails:找不到用户的附件或没有评论

时间:2017-05-21 14:36:36

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

附件has_one :comment, optional: true

附件has_one :user, through :comment,评论 - 通过任务,任务 - 通过项目

我想找到所有current_user附件以及没有所有者的附件 - >没有家长评论

查询Attachment.joins(comment: [task: [:project]]).where('projects.user_id = ? OR attachments.comment_id IS NULL', user.id)不包括没有评论的附件,为什么?

[10] pry(#<CommentResource>)> Attachment.all
=> [#<Attachment:0x00000008a6f3a8
  id: 1,
  file: "attachments.rb",
  comment_id: 1,
  created_at: Sun, 21 May 2017 14:18:21 UTC +00:00,
  updated_at: Sun, 21 May 2017 14:18:21 UTC +00:00>,
 #<Attachment:0x00000008a6f268
  id: 2,
  file: "attachments.rb",
  comment_id: 1,
  created_at: Sun, 21 May 2017 14:18:21 UTC +00:00,
  updated_at: Sun, 21 May 2017 14:18:21 UTC +00:00>,
 #<Attachment:0x00000008a6f128
  id: 3,
  file: "attachments.rb",
  comment_id: nil,
  created_at: Sun, 21 May 2017 14:29:51 UTC +00:00,
  updated_at: Sun, 21 May 2017 14:29:51 UTC +00:00>]
[11] pry(#<CommentResource>)> Attachment.joins(comment: [task: [:project]]).where('projects.user_id = ? OR attachments.comment_id IS NULL', user.id).to_sql
=> "SELECT \"attachments\".* FROM \"attachments\" INNER JOIN \"comments\" ON \"comments\".\"id\" = \"attachments\".\"comment_id\" INNER JOIN \"tasks\" ON \"tasks\".\"id\" = \"comments\".\"task_id\" INNER JOIN \"projects\" ON \"projects\".\"id\" = \"tasks\".\"project_id\" WHERE (projects.user_id = 1 OR attachments.comment_id IS NULL)"
[12] pry(#<CommentResource>)> Attachment.joins(comment: [task: [:project]]).where('projects.user_id = ? OR attachments.comment_id IS NULL', user.id)
=> [#<Attachment:0x0000000891c7a8
  id: 1,
  file: "attachments.rb",
  comment_id: 1,
  created_at: Sun, 21 May 2017 14:18:21 UTC +00:00,
  updated_at: Sun, 21 May 2017 14:18:21 UTC +00:00>,
 #<Attachment:0x0000000891c668
  id: 2,
  file: "attachments.rb",
  comment_id: 1,
  created_at: Sun, 21 May 2017 14:18:21 UTC +00:00,
  updated_at: Sun, 21 May 2017 14:18:21 UTC +00:00>]

1 个答案:

答案 0 :(得分:0)

活动记录上的联接方法使用内部联接查询记录,这意味着在您的情况下,它仅返回带注释的附件。如果要包含没有注释的附件,则需要保留外连接。

http://guides.rubyonrails.org/active_record_querying.html#left-outer-joins