2017-02-09 97 views
1

这是我第一次使用foreign_key,而且我不知道如何为它创建验证。问题是这样的:Ruby on Rails:在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.(可选)确保current_user(发件人)只接受sender_id(收件人)。

对不起,如果它有点难,我真的不知道该怎么做。如果您有代码段,请将其发布。提前致谢!

+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