关于 ruby?? on rails:查询父模型相对于当前用户的子模型

Querying Parent Model with respect to current user's Child Model

根据设计文档,current_user 的相关记录总是可用的,尽管我以前读过。例如:current_user.comments current_user.profile_images

真正让我烦恼的是:

Post.rb

1
2
3
4
5
6
7
class Post < ApplicationRecord

    belongs_to :user

    has_many :postsettings, inverse_of: :post

    accepts_nested_attributes_for :postsettings

用户.rb

1
2
3
4
class User < ApplicationRecord

has_many :posts
has_many :postsettings

Postsettings.rb

1
2
3
class Postsetting < ApplicationRecord
    belongs_to :post, required: false
    belongs_to :user, required: false

在帖子控制器中我有这个:

1
2
@post_delete = current_user.postsettings.includes(:postsettings).where.not
(postsettings: {user_id: current_user.id, delete_post: false})

哪个有效,但没有产生预期的结果,因为我需要查询 current_user.POSTSETTINGS.delete_post 为真或假的所有帖子。

所以我已经研究了几天了,我设法想出了这个:

1
2
@post_delete = Post.includes(current_user.postsettings).where(
postsettings: {user_id: current_user.id, delete_post: false})

这会产生一条我以前从未见过的错误消息。

1
2
3
4
5
 ActiveRecord::ConfigurationError in Posts#index
#<Postindex id: 284, read: nil,
created_at:"2017-04-15 11:38:02",
updated_at:"2017-04-15 11:38:02", post_id: 96, user_id: 1,
delete_post: false>

据我所知,这表明查询找到了它需要找到的所有内容。但它实际上不会起作用。请帮帮我....我快死在这里了。


1
2
3
Post.joins(:postsettings)
    .where(postsettings: { user: current_user } )
    .where(postsettings: { delete_post: [true, false] })

.joins 创建一个 INNER JOIN,这意味着只返回 posts 中与 postsettings 匹配的行。


max给出的答案很好,不过为了方便,你可以如下设置你的用户模型。将此行添加到您的用户模型中。

1
has_many :posts_with_settings, through: :postsettings, source: :post

现在您应该可以调用 current_user.posts_with_settings 来为您提供所有为 current_user 设置了 postsettings 的帖子。从那里您可以根据需要进行过滤,例如

current_user.posts_with_settings.where(postsettings: {delete_post: true})

有关 :through 选项的更多信息,请参见此处。