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

时间:2013-01-27 07:33:18

标签: ruby-on-rails-3 ruby-on-rails-3.2

我正在编写一个Rails 3.2应用程序,这种类型的要求经常出现我确定。在我的应用程序中,我有以下ActiveRecord模型:

  • 用户
  • 消息
  • 联系人
  • MessageContacts(消息< - >联系人的has_many到表)

我想确保当用户创建新邮件时,他们只能将自己的联系人添加到邮件中。是否愿意听到可能使此过程干涸的建议和/或相关宝石(cancan?)。

以下是我放在一起的内容,似乎有效,但我想知道我是否正确地做到这一点。

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

1 个答案:

答案 0 :(得分:0)

您的代码遵循此类情况的可接受风格。

如果您不希望用户不拥有的每个联系人都有错误,但尝试包含您不拥有的联系人只有一个错误,您可以这样做:

validates :contacts_ownership

def contacts_ownership
  errors.add(:contacts, 'must belong to you') unless (contacts - user.contacts).empty?
end

但它更多的是品味和要求而不是首选方法。如果每个联系人都需要错误,那么您的方式会更好。如果您只需要AN错误,这种方式可能更好。它还可以帮助您,如果需要,它可以更容易阅读,更容易单独测试。