0

例:

  • Aは aPlaceに属しUserます。
  • はにEvent属しUserます。
  • AnEventは a に属します (ただし、持つ必要はありません) Place

EventPlace常にそれ自体と同じUserであることを検証したいと思いPlaceます。

この形式のバリデーションはかなり一般的なように見えますが、私は常に独自のバリデータを作成することになります。完全を期すために私のバージョンを以下に含めますが、慣習があるべきだと思います。

4

2 に答える 2

2

Event が常にと同じUserである場合Place、おそらく次のように関連付けをモデル化する必要があります。

User
  has_many :places
  has_many :events, through: :places

Place
  has_many :events
  belongs_to :user

Event
  belongs_to :place
  has_one :user, through: :place

次に、検証は必要ありません。アソシエーションの構造は、それを無料で強制します。

更新:Placeオプションですが、私はまだこのように関連付けを構成します! Null Objectパターンを打ち破りたいと思われるかもしれません。実装する方法はいくつかあります。おそらく、単一テーブルの継承が適しています。

NullPlace < Place基本的に、いくつかの特別な動作 ( name「未指定」のようなプレースホルダーである可能性があります)を持つsubclass を作成しますが、関連付けに関しては、通常のように動作するPlaceため、検証は必要ありません!

于 2013-01-25T22:45:10.943 に答える
0

私のEventモデルの中で:

validate :user_consistency

def user_consistency
  errors.add :place, 'must belong to same user as event' unless place.nil? or place.user == user
end
于 2013-01-25T22:39:36.870 に答える