我正在编写一个 Rails 3.2 应用程序,我敢肯定,这种类型的要求经常出现。 在我的应用程序中,我有以下活动记录模型:
- 用户
- 消息
- 接触 消息
- 联系人(消息<>联系人的has_many到表)
我想确保当用户创建新消息时,他们只能将自己的联系人添加到消息中。 很想听听建议和/或相关宝石(康康?
以下是我整理的内容,它似乎有效,但想知道我是否以正确的方式做到这一点。
class Message < ActiveRecord::Base
belongs_to :user
has_many :message_contacts
has_many :contacts, through: :message_contacts
validates_each :contacts do |record, attr, contacts|
contacts.each do |contact|
record.errors.add(attr, 'must belong to you') if contact.user_id != record.user_id
end
end
end
在这种情况下,您的代码遵循公认的样式。
如果您不希望用户不拥有的每个联系人都出现错误,而只是在尝试包含您不拥有的联系人时出现一个错误,则可以改为执行以下操作:
validates :contacts_ownership
def contacts_ownership
errors.add(:contacts, 'must belong to you') unless (contacts - user.contacts).empty?
end
但这更多的是品味和要求的问题,而不是首选方法。如果您需要每个联系人的错误,您的方式更好。如果您只需要一个错误,这种方式可能更可取。它还可以帮助您,因为它更具可读性,并且在需要时更容易单独测试。