0

私はRails 3.2アプリケーションを書いていますが、このタイプの要件はかなり頻繁に出てくると思います. 私のアプリケーションには、次の ActiveRecord モデルがあります。

  • ユーザー
  • メッセージ
  • 連絡先
  • MessageContacts (メッセージ <-> 連絡先の has_many スルー テーブル)

ユーザーが新しいメッセージを作成するときに、自分の連絡先のみをメッセージに追加できるようにしたいと考えています。このプロセスを DRY にする可能性のある提案や関連する宝石 (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

あなたのコードは、この種の状況で受け入れられているスタイルに従っています。

ユーザーが所有していない連絡先ごとにエラーが発生するのではなく、所有していない連絡先を含めようとしたときにエラーが 1 つだけ発生するようにする場合は、代わりに次のようにします。

validates :contacts_ownership

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

しかし、それは好ましい方法というよりも好みと要件の問題です. 連絡先ごとにエラーが必要な場合は、あなたの方法が適しています。ANエラーだけが必要な場合は、この方法が望ましい場合があります。また、必要に応じて、もう少し読みやすく、個別にテストしやすいという点でも役立ちます。

于 2013-01-27T13:06:06.187 に答える