1

Rails - has_manyを使用した場合の影響:has_and_belongs_to_many? tagは、多くのポストに属しているので、私はhas_and_belongs_to_manyを使う理由があるhas_many:through with has_and_belongs_to_many in Rails

class Tag < ActiveRecord::Base 
    has_many :posts_tag 
    has_and_belongs_to_many :posts 
end 

class Post < ActiveRecord::Base 
    has_many :posts_tag 
    has_many :tags, :through => posts_tag 
end 

class PostsTag < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :post 
end 

:以下に示すように多対多の関係を持って投稿し、タグ - 二つのモデルを持つことを検討してください。

私はRails Association guideを調べて、多対多の関係についてこのケースについて言及していないことを確認します。私は、しかし、これを試してみて、どんな行動が得られなかったのRailsでそれを実行していると私は構築された小規模なテスト・データベースから、またpost.tagstag.postsに対して正しい結果を返すように見えた - posttagはのインスタンスを参照してください。それぞれPostおよびTagモデル。

この正しい使用法ですか、それとも私が気づいていない副作用がありますか?また、正しい場合は、これを実現するRailsの方法ですか?

ありがとうございます!

答えて

2

多対多の関連付けを設定している場合(つまり、反対側にもhas_and_belongs_to_manyがある場合)のみ、has_and_belongs_to_manyを使用します。それがこの協会の意味です。

あなたは、私は(これが正しい方法であるため)、複数、post_tagsを使用

class Tag < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :posts, :through => :post_tags 
end 

class PostsTag < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :post 
end 

class Post < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :tags, :through => :posts_tags 
end 

お知らせを持つ必要があります。

、あなたのコメントのような状況を持っている場合は、あなたが持っている必要がありますあなたのPostTagモデルで

belongs_to :post_tag 
あなた Postモデルで

、および

has_many :posts 

あなたが今尋ねることがあります。「?それはタグにを属していんなぜ私がbelongs_to :post_tagを使用する必要があり、それタグを持っているので、私はhas_one :post_tagを使用しないでください。?」。これは私の質問でもありましたが、Railsが英語に完全に合うとは限りません。 postにはpost_tag_idの列が必要で、belongs_toにはそれが正確に必要です。一方、has_onepost_idという名前の列があなたのpost_tagである側に存在することを期待します。 post IDがpost_tagsで開催することはできませんのでpost_tagは、多くのposts(だけではなく、1)を持っているので、しかし、これは、不可能であろう。

更新
団体との差が、あなたが渡すことができますが提供されている方法とオプションのみです(1は団体のレールガイドで説明します)。例えば、方法association=create_associationは(私は上記の説明のように)外部キーがあるべき場所に関するさまざまなことを暗示し、

association(force_reload = false) 
association=(associate) 
build_association(attributes = {}) 
create_association(attributes = {}) 

しかし、たとえば、has_onebelongs_toは、同じメソッドを持っています。

has_and_belongs_to_manyhas_manyのメソッドには違いはありませんが、渡すことのできるオプションが異なります。たとえば、has_many協会に

:dependent => :destroy 

に渡すことができますが、それは多対多の関連を意味するのでそれは、意味がありませんので、あなたは、has_and_belongs_to_manyにそれを渡すことはできません。親レコードが破壊された場合、子レコードは、まだ他のレコードと接続することができるので、彼らはまた、破壊すべきではありません。およそ `反対側の関係と` has_and_belongs_to_many`のhas_one`片側を使用しての側面が、どのように影響するか

+0

はい、私は、あなたが「Railsが英語に完全に合うとは限りません」と言った部分を推測します:P いくつかの一般的な操作が 'has_many:through'と' has_and_belongs_to_many'純粋に教育的観点からは、それに副作用があるかどうかを知ることは面白いだろう。私はそれを使用する正しい方法ではないことを理解しています。 –

+0

アップデートを見てください。 –

+0

ありがとう!それは理にかなっている :) –

1

私は関係の片側のhas_many :throughと反対側のhas_and_belongs_to_manyを持つの正確な効果のわからないが、私はより多くの正しい方法は、そのように逆転has_many :throughを用いることであろうことを知っています:

class Tag < ActiveRecord::Base 
    has_many :posts_tag 
    has_many :posts, :through => posts_tag 
end 

他の関係を同じに保ちます。

+0

?私たちは、それぞれ 'POST'は高々1' tag'を持つことができると言うことであれば、上記の例では例えば。しかし、 'tag'は多くの' posts'に属します。 –

+0

その場合、あなたは少し後方関係を持っています。タグ 'has_many'は投稿、投稿は' belongs_to'タグです。 Postには 'tag_id'が付いているので、1つのタグだけが許可されます。 'has_and_belongs_to_many'は' has_many'が使用されないことをテーブルに参加隠さを使用する予定です。 – ctcherry

関連する問題