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 匹配的行。
- "根据设计文档,与 current_user 的相关记录始终可用,尽管我以前读过。" - 我不知道你的真正意思是什么。 Devise 是一个身份验证系统,与如何从用户模型中加入相关模型无关。您正在寻找的是授权 - 而不是身份验证。
-
需要明确的是,当您使用 current_user 辅助方法时,Devise 不会加入任何关联的模型。你读到的都是假的,或者你误解了它。
-
我知道了。感谢您指出了这一点。但是,我不能让它工作,因为如果我将它标记为 delete_post,它不会删除帖子:真......
-
哥们什么?您可以编辑您的问题以实际连贯地说明您实际尝试实现的目标吗?
-
抱歉。我认为如果一个 Post 的 postsettings 上有一个 post_delete 列,那么它的目的是模仿 Post 的删除是很明显的。我将编辑问题。
-
在您的问题中,您要求"我需要查询 current_user.POSTSETTINGS.delete_post 为真或假的所有帖子。"这就是上面的内容。如果您只想要不正确的那些,则将 delete_post: [true, false] 更改为 delete_post: false。但是你应该确保 delete_post 默认为 false,这样你就没有空值。
-
是的,postsettings 与 Post on Post 创建一起创建为nested_attributes,所以我默认将其设置为 false。但是,如果我将属于用户的 Postsetting 标记为 True,我仍然无法隐藏帖子。
-
我说的是为列设置数据库默认值。你问的是五种不同的东西,然后只是说 it does'nt work。这不是问题陈述。它几乎不可能帮助你。我建议您退后几步 - 查看您的设置,然后询问具体问题。
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 选项的更多信息,请参见此处。
-
嘿redFur,这是一个很好的答案。但是,我在尝试时遇到了"无法在模型用户中找到关联:postsettings"。
-
我实际上尝试添加冒号。不,错误仍然存??在。
-
哦,对不起,今天的错别字太糟糕了。我认为它实际上应该是 source: :post。再试一次?已编辑。
-
是的,你是对的!但是,原来的问题仍然存在。您是否建议查询看起来像这样:@post_delete = current_user.posts_with_settings.where(postsettings: {delete_post: false}) 或者?因为这没有考虑到我希望用户能够看到平台上的所有帖子a€"然后用户可以根据需要删除/隐藏帖子。现在,用户只能看到他们创建的帖子。
-
抱歉,我无法理解您到底想要做什么。设置 delete_post: true 究竟应该做什么?它是否表明用户是否有权删除帖子?如果您只是想删除帖子,只需在帖子控制器中执行类似 Post.find(params[:id]).destroy 的操作。我想,最初的问题是关于查询 postsetting 对应 current_user 的帖子。
-
很抱歉不清楚。我正在尝试做的是模仿删除帖子。所以:用户 A 创建了一个帖子。网站上的每个人都可以看到它,但用户可以单独选择"删除"或隐藏他们不喜欢或不想要的帖子(并且必须是持久的)。但所有其他未将帖子标记为已删除的用户仍将正常看到该帖子/帖子。
-
让我们在聊天中继续这个讨论。