0

私はRailsn00bであり、ユーザーが多くのお気に入りのアイテムを持つことができるように「お気に入り」の関係を作成したいと思います。これを行う方法が完全にはわかりません。これが私が試みる方法ですが、これが良い習慣であるかどうかはわかりません。

class User < ActiveRecord::Base
 has_many :favorites
 //other code
end

class Favorite < ActiveRecord::Base
 belong_to :user
 has_one :item
end

class Item < ActiveRecord::Base
 belongs_to :item
end

これはそれを行うための良い方法ですか?使用する必要がありhas_and_belongs_to_manyますか?私は次のシナリオに特に関心があります。ユーザーが100個のお気に入りのアイテムを持っているとします。私がするとき、私はUser.find(id)100のお気に入りと100のアイテムも取得しますか?

重要な場合:Rubyバージョン1.9.3、Railsバージョン3.2.11

4

3 に答える 3

3

やってみhas_many => :throughませんか?

class User < ActiveRecord::Base
 has_many :favorites
 has_many :items, :through => :favorites
 //other code
end
于 2013-02-07T16:39:12.357 に答える
2

あなたの場合、has_many:throughは間違いなく進むべき道です。読むことをお勧めします:http://guides.rubyonrails.org/association_basics.html

あなたの質問に関して特に興味深い:

2.8 has_many:throughとhas_and_belongs_to_manyの選択

Railsは、モデル間の多対多の関係を宣言する2つの異なる方法を提供します。より簡単な方法は、has_and_belongs_to_manyを使用することです。これにより、直接関連付けを行うことができます。

class Assembly < ActiveRecord::Base
  has_and_belongs_to_many :parts
end

class Part < ActiveRecord::Base
  has_and_belongs_to_many :assemblies
end

多対多の関係を宣言する2番目の方法は、has_many:throughを使用することです。これにより、結合モデルを介して間接的に関連付けが行われます。

class Assembly < ActiveRecord::Base
  has_many :manifests
  has_many :parts, :through => :manifests
end

class Manifest < ActiveRecord::Base
  belongs_to :assembly
  belongs_to :part
end

class Part < ActiveRecord::Base
  has_many :manifests
  has_many :assemblies, :through => :manifests
end

最も簡単な経験則は、関係モデルを独立したエンティティとして操作する必要がある場合は、has_many:through関係を設定する必要があるということです。リレーションシップモデルで何もする必要がない場合は、has_and_belongs_to_manyリレーションシップを設定する方が簡単な場合があります(ただし、データベースに結合テーブルを作成することを忘れないでください)。

結合モデルで検証、コールバック、または追加の属性が必要な場合は、has_many:throughを使用する必要があります。

于 2013-02-07T17:18:30.907 に答える
0

を使用するよりも優れていhas_and_belongs_to_manyます。

User.find(id)を実行すると、100個のお気に入りと100個のアイテムも取得されますか?

いいえ。ユーザーオブジェクトを取得するだけです。

更新:User.include(:favourites, :items).find(id)ユーザーオブジェクトからアイテムテーブルを何度も呼び出したい場合は、 呼び出すと結合テーブルが取得されます。

于 2013-02-07T17:09:07.307 に答える