【问题标题】:Ruby on Rails: Help in foreign_key model validationsRuby on Rails:帮助 foreign_key 模型验证
【发布时间】:2023-03-22 00:41:01
【问题描述】:

这是我第一次使用foreign_key,我不太知道如何为其创建验证。问题是这样的:

我正在创建一个聊天请求和聊天框应用程序。

我有这样的聊天请求模型。

chatrequest.rb
has_many :conversations
belongs_to :user

接下来,我有一个对话模型,当他接受聊天请求时,它会批量处理用户。

conversation.rb
belongs_to :chatrequest
belongs_to :sender, foreign_key: "sender_id", class_name: "User"
belongs_to :recipient, foreign_key: "recipient_id", class_name: "User"

逻辑已经在起作用了。我创建了一个 link_to 函数,它结合了创建聊天对话模型,如下所示:

<p>
<%= link_to 'Chat me', conversations_path(sender_id: current_user.id, recipient_id: @chatrequest.user.id, chatrequest_id: @chatrequest.id), method: 'POST' %>
</p>

现在,我想要实现的是这 3 个验证:

  1. current_user != recipient_id(不能接受对自己的请求)
  2. 除非 current_user.id == sender_id 否则不会创建
  3. 除非 chatrequest.user.id == recipient_id 否则不会创建 4.(可选)确保 current_user(sender) 只接受 sender_id(recipient)。

对不起,如果有点难,我真的不知道该怎么办。如果您有代码 sn-ps,请同时发布。提前致谢!

【问题讨论】:

  • 如果您找到另一种方法,我很想知道我的方法是否有效。

标签: ruby-on-rails ruby


【解决方案1】:

您既可以创建自己的方法来验证几乎所有内容,也可以使用 ActiveRecord 方法。如果你自己做,你可以用丑陋的方式来做:

validate :conversation_is_valid

def conversation_is_valid
  errors.add(:recipient, "can't be the sender") if recipient_id != current_user
  errors.add(:sender, "needs to be the current user") if current_user.id == sender_id
  errors.add(:chatrequest, "user needs to be the recipient") if chatrequest.user.id == recipient_id
end

这将确保检查您的所有要求,并且如果它不正确,它将不会持续存在。否则它会通知你错误。有多种方法可以做到这一点,请查看Validations Guide

【讨论】: