1

私はChoosing Between has_many :throughandhas_and_belongs_to_many on the Rails Webサイトを読みましたが、Webサイトに記載されているケースとは異なるケースがあるため、少し混乱しています。

Propとの2 つのモデルがあります。CharacterCostumeキャラクターのコスチュームには複数の小道具を関連付けることができますが、小道具はそのキャラクターに属しておらず、シーン内の任意の数のキャラクターが使用することもできます。

今、私はhas_and_belongs_to_many :props自分のCharacterCostumeモデルの中にあり、それは私がやりたいことを正確に行います.character_costumes_props呼び出し時に名前が付けられたテーブルを使用して、衣装に関連付けられたすべての小道具を取得します.CharacterCostume#props

しかし、協会名は「多くのものに属している」という部分のために私を先延ばしにしています。コスチュームはどの小道具にも属さないので、モデルのhas_and_belongs_to_many :character_costumes内部はありません.Prop

それがなくてもすべて正常に機能することはわかっていますが、has_many :through関連付けを使用する必要があるのではないかと考えましたが、それには余分なモデルを作成する必要があります(それは余分ですよね?) モデルは次のようになります。

class CharacterCostumeProp < ActiveRecord::Base
  belongs_to :character_costume
  has_one :prop
end

また、has_one代わりにbelongs_toここで働きませんか?

コードを可能な限りセマンティックにしたいのですが、中間モデルがあるため、これによりリソースの要件が増加するか、何らかの形でパフォーマンスが低下するかはわかりません。

どちらのアプローチにも特定の癖/利点がありますか? 私のは十分ですか?それとも、私の考えは、私がしなければならないことから完全に間違っていますか?

ありがとう!

4

3 に答える 3

2

リレーションモデルを直接操作したいので、 a を使用したいと思います:has_many, :through-どのシーン、消費または損傷など.

しかし、それがおかしくなる理由は、ほとんどの場合、それらが英語で意味することを実際には意味していないhas_manyからです. belongs_toそれらが実際に意味するのは、それぞれ「彼らは外部キーを持っている」と「私は外部キーを持っている」ということです。例外は:dependent => :destroy動作です。

has_and_belongs_to_many「彼らは外部キーを持っており、私は外部キーを持っている」と言っているので、それはまだ実際には役に立ちません-「私」と「彼ら」はたまたまそれぞれの同じ部分であり、それらの鍵を持っています.

それは役に立ちますか?

于 2013-06-10T01:01:14.837 に答える
0
  1. has_one機能しません、必要ですbelongs_to
  2. 関連モデルにロジックがあれば不要ではありません
  3. has_and_belongs_to_many で十分です

以下の例を参照してください

class Student
  has_and_belongs_to_many :courses
  has_many :teachers, through: :courses
end

class Teacher
  has_many :courses
  has_many :students, through: :courses
end

class Course
  has_and_belongs_to_many :students
  belongs_to  :teacher

  def boring?
    teacher.name == 'Boris Boring'
  end
end

上記の例では、両方のバージョンを使用しています。Course がどのように独自のロジックを持っているかをご覧ください。CourseStudent のクラスがそうではないことがわかりますか? それがすべてです。まあ、私にはそうです。has_many through関連モデルに適切な名前を付けられない限り、および/またはモデルに追加のロジックや動作が必要ない限り、使用します。

于 2013-06-10T00:43:02.580 に答える