1

2 つのテーブル (投稿とカテゴリ) 間の has_many :through 関連付けセットアップがあります。HABTM の代わりに has_many :through を使用している理由は、結合テーブル (PostCategory) で何らかの検証を行いたいからです。

したがって、ここでは 4 つのモデルを使用しています。

ユーザー:

has_many :posts
has_many :categories

役職:

belongs_to :user
has_many :post_categories
has_many :categories, :through => :post_categories

カテゴリー:

belongs_to :user
has_many :post_categories
has_many :posts, :through => :post_categories

投稿カテゴリー:

belongs_to :post
belongs_to :category

基本的に私が欲しいのは、ユーザーが投稿を作成でき、ユーザーが独自のカテゴリを作成できることです。その後、ユーザーは投稿を分類できます (自分の投稿だけでなく、すべての投稿)。投稿は、さまざまなユーザーによって (さまざまな方法で潜在的に) 分類される可能性があり、1 つのカテゴリにはさまざまな投稿が含まれる可能性があります (ユーザーは、自分の特定のカテゴリの下に N 個の投稿を分類できます)。

ここで、私にとって少しトリッキーになります (私は Rails 初心者です)。 投稿は、特定のユーザーの 1 つのカテゴリにのみ属することができます。つまり、投稿はどのユーザーに対しても複数のカテゴリに属する​​ことはできません。

私ができるようにしたいのは、これに対する検証を作成することです。私は方法を理解することができませんでした。私は(PostCategory内)のようなことを試しました

validates_uniqueness_of :post_id, :scope => :category_id

しかし、私はこれが正しくないことを認識しています。これは、投稿が 1 つのカテゴリに属していることを確認するだけです。つまり、1 人のユーザーが投稿を分類すると、他のユーザーは分類できなくなります。

本当に私が探しているのは、PostCategory モデル (または他の場所) でこれを検証する方法です。また、データベーススキーマを変更することで物事が簡単になるのであれば、それにも反対ではありません (このスキーマは非常に単純だと感じただけです)。

何か案は?

4

2 に答える 2

3

最も簡単な方法は、スコープを追加user_idしてPostCategory一意性を検証することです。post_iduser_id

もう 1 つの方法は、カテゴリの所有者がその投稿にカテゴリを追加したかどうかを SQL を使用してチェックするカスタム検証を作成することです。

于 2012-07-31T17:12:52.397 に答える
1

オプション 1: を使用しbefore_saveます。その中で、SQLルックアップを実行して、ユーザーの同様のカテゴリの投稿が存在しないことを確認します(編集時に、現在の投稿を検索しないようにする必要があることに注意してくださいすでにDBにある)

オプション 2 : カスタムバリデーター: http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#custom-validators

それらを使用したことはありませんが、あなたが望むことができるように思えます

于 2012-07-31T17:05:59.157 に答える