0

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

1 回答 1

0

对于这种情况,您的代码遵循公认的风格。

如果您不希望用户不拥有的每个联系人都出现错误,而只是尝试包含您不拥有的联系人时出现错误,则可以改为:

validates :contacts_ownership

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

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

于 2013-01-27T13:06:06.187 回答