1

Rails - has_and_belongs_to_many で has_many :through を使用すると、どのような効果がありますか? 以下に示すように、多対多の関係を持つ投稿とタグの 2 つのモデルがあることを検討してください。

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

私が使用する理由has_and_belongs_to_manyは、 atagが多くの投稿に属しているためです。

Rails Associationのガイドを調べたところ、多対多の関係についてこのケースについて言及されていないことがわかりました。しかし、私はこれを試してみましたが、Rails で実行しても何の動作も得られず、私が構築した小さなテスト データベースからも正しい結果が返されpost.tagsたようでした。 tag.postsposttagPostTag

これは正しい使用法ですか、それとも私が気付いていない副作用がありますか? また、それが正しければ、これはこれを達成するRailsの方法ですか?

ありがとう!

4

2 に答える 2

2

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

あなたが持っている必要があります

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

複数形を使用していることに注意してくださいpost_tags(これが正しい方法であるため)。

コメントのような状況がある場合は、

belongs_to :post_tag

あなたのPostモデルで、そして

has_many :posts

あなたのPostTagモデルで。

「なぜ を使用する必要があるのですか?タグには属してませbelongs_to :post_tagん。タグがあります。だから、使用すべきではないのですか?」これも最初は私の質問でしたが、Rails が必ずしも英語に完全に適合するとは限らないことに気付きました。の列が必要であり、まさにそれを期待しています。一方、という名前の列が反対側に存在することを期待します。つまり、 . しかし、これは不可能です。1 つだけではなく多数あるため、ID を に保持することはできません。has_one :post_tagpost_tag_idpostbelongs_tohas_onepost_idpost_tagpost_tagpostspostpost_tags

更新:
関連付けの違いは、提供されるメソッドと渡すことができるオプション (関連付けに関する Rails ガイドで説明されているもの) のみです。たとえば、同じメソッドがありますhas_onebelongs_to

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

しかし、たとえば、メソッドassociation=create_associationは、外部キーがどこにあるべきかに関して異なることを暗示しています (上で説明したように)。

has_and_belongs_to_manyおそらくメソッドに違いはありhas_manyませんが、渡すことができるオプションが異なります。たとえば、次のように渡すことができます。

:dependent => :destroy

ただし、多対多の関連付けを意味するため、意味がないため、 a に渡すhas_manyことはできません。has_and_belongs_to_many親レコードが破棄された場合でも、子レコードは他のレコードと接続できるため、それらも破棄しないでください。

于 2012-02-23T14:38:21.490 に答える
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

他の関係を同じに保つ。

于 2012-02-23T07:44:44.070 に答える