例:
- Aは a
Place
に属しUser
ます。 - はに
Event
属しUser
ます。 - An
Event
は a に属します (ただし、持つ必要はありません)Place
。
Event
がPlace
常にそれ自体と同じUser
であることを検証したいと思いPlace
ます。
この形式のバリデーションはかなり一般的なように見えますが、私は常に独自のバリデータを作成することになります。完全を期すために私のバージョンを以下に含めますが、慣習があるべきだと思います。
例:
Place
に属しUser
ます。Event
属しUser
ます。Event
は a に属します (ただし、持つ必要はありません) Place
。Event
がPlace
常にそれ自体と同じUser
であることを検証したいと思いPlace
ます。
この形式のバリデーションはかなり一般的なように見えますが、私は常に独自のバリデータを作成することになります。完全を期すために私のバージョンを以下に含めますが、慣習があるべきだと思います。
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
ため、検証は必要ありません!
私の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