gpt4 book ai didi

ruby-on-rails - belongs_to 关联中的所有权条件

转载 作者:数据小太阳 更新时间:2023-10-29 08:44:34 34 4
gpt4 key购买 nike

我有两个模型:UsersPosts。按照我的设置方式,帖子属于所有者(即用户)并且还有许多参与者(即用户)。在我的用户模型中,我想确保 owner 永远不属于 post。我在前端完成了此操作,但发现了比需要更多的代码。

这让我相信使用 conditions 将是一个理想的解决方案。我见过以这种方式使用的 SQL 条件,但不确切知道在所有权场景中完成此操作的最佳方式是什么。有什么建议吗?

class User < ActiveRecord::Base
has_many :posts
# belongs_to :posts, conditions: ...
end

class Post
has_many :participants, class_name: "User", foreign_key: "user_id"
belongs_to :owner, class_name: "User", foreign_key: "user_id"
end

最佳答案

要实现这一目标,我认为您需要第三种模式。如果您按如下方式设置它应该可以工作:

用户模型:

class User < ActiveRecord::Base
has_many :posts # This is the other side of your owner association
has_many :user_posts # This is your link table for participants
has_many :participations, through: :user_posts, source: :user # These are the posts the user is a participant in
end

后模型:

class Post < ActiveRecord::Base
has_many :user_posts, ->(p) { where.not(user_id: p.user_id) } # Here is your condition for the participants
has_many :participants, through: :user_posts, source: :user
belongs_to :owner, class_name: "User", foreign_key: "user_id"
end

UserPost 模型:

class UserPost < ActiveRecord::Base
belongs_to :user
belongs_to :post
end

正如@Oxynum 的回答所表明的那样,您还应该考虑在 UserPost 模型中进行验证,以防止参与者同时也是所有者时被保存:

validate :participant_cannot_be_owner

def participant_cannot_be_owner
if user == post.try(:owner)
errors.add(:user_id, "can't be the owner of the post")
end
end

关于ruby-on-rails - belongs_to 关联中的所有权条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33829369/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com