Rails:验证模型以确保新关联归特定用户所有的最佳方式



我正在编写一个 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

但这更多的是品味和要求的问题,而不是首选方法。如果您需要每个联系人的错误,您的方式更好。如果您只需要一个错误,这种方式可能更可取。它还可以帮助您,因为它更具可读性,并且在需要时更容易单独测试。

相关内容

最新更新