Ruby on Rails:帮助进行foreign_key模型验证

时间:2017-02-09 08:43:05

标签: ruby-on-rails ruby

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

我正在创建聊天请求和聊天框应用。

我有这样的chatrequest模型。

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>

现在,我想要实现的是这三种验证:

  1. current_user!= recipient_id(无法接受自行请求)
  2. 除非current_user.id == sender_id ,否则
  3. 不会创建 除非chatrequest.user.id == recipient_id,否则
  4. 不会创建 4.(可选)确保current_user(发件人)只接受sender_id(收件人)。
  5. 对不起,如果有点难,我真的不知道该怎么办。如果您有代码段,请同时发布。提前谢谢!

1 个答案:

答案 0 :(得分: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