0

映画モデルと人物モデルがあります。

映画モデルには、俳優、作家、プロデューサーのグループが必要です。

俳優、作家、プロデューサーは、すべて同じ人物モデルの人物のグループです。

これをモデル化するための最良の方法は何でしょうか?

ありがとう。

編集:各人は同時に俳優、作家、プロデューサーになることができます。そして、それらはすべて同じ属性を持っています。

編集2:私がやりたいことは次のようなものです:

Class Movie < ActiveRecord::Base
  attr_accessible :name, :image, :information, :duration, :director, etc...

  has_many :persons, as: :writers <-- (IDK if this is possible)
  has_many :persons, as: :producers <-- (IDK if this is possible)
  has_many :persons, as: :actors <-- (IDK if this is possible)
end
Class Person < ActiveRecord::Base
  attr_accessible :birthdate, :birthplace, :height, :information, :name, etc..
end

ムービーモデルでグループを作成するので、次のように呼び出すことができます。

@writers = @movie.writers
@actors = @movie.actors
@producers = @movie.producers

すべてPersonオブジェクトで構成され、3つのタイプのいずれかである可能性があります。

人は他の多くの映画に関与する可能性があります。

4

6 に答える 6

1

それはすべて、俳優、作家、プロデューサーの属性の違いによって異なります。それらがすべて同じ属性(またはほとんど同じ属性)を持つ場合は、単一テーブル継承を使用できます。Personモデルの属性の1つをと呼ばれる属性にするとtype、STIがトリガーされます。

STIを使用するかどうかは、データベース内のnull値の許容範囲によって異なります。アクター、ライター、プロデューサーの間で共有される属性の数が少ない場合は、null値の数になり、それぞれに異なるクラスを設定する方がよい場合があります。

公式ドキュメントはSTIに限定されていますが、実装についてさらに詳しく説明している興味深いブログ投稿がいくつか見つかりました。

http://blog.thirst.co/post/14885390861/rails-single-table-inheritance http://www.christopherbloom.com/2012/02/01/notes-on-sti-in-rails-3-0 //

于 2013-03-25T17:01:34.023 に答える
1

別のモデルが必要ない場合は、Person(またはMovie)モデルに職業列を追加してみませんか?それらがほぼ同じ属性を持っていると仮定すると、それらはすべて同じテーブルで処理できます。複数を使用できます:true、1人あたり複数の職業を選択できるようにします。

PSこれらの職業に別の映画モデルを使用する理由を詳しく説明していただけますか?

編集:

あなたが多くの職業を持っていて、人が同時に複数の職業を持つことができるなら、あなたはhas_many:through関係を使うことを検討するかもしれません。のように:

class Person
  has_many :assignments
  has_many :professions, through: assignments
end

class Assignment
  belongs_to :person_id
  belongs_to :profession_id
end

class Profession
  has_many :assignments
  has_many :persons, through: assignments
end

このようにして、必要に応じて結合モデルに属性を追加できます。

于 2013-03-25T18:20:27.050 に答える
1

あなたができる新しい情報を考えると

Class Movie < ActiveRecord::Base
  has_many :writers, :class_name => 'Person', :conditions => ['role = "writer"']
  has_many :producers, :class_name => 'Person', :conditions => ['role = "producer"']
  has_many :actors, :class_name => 'Person', :conditions => ['role = "actor"']
end

:conditions内の条件は、役割の割り当てを実装する方法によって異なります。

ここにすべての情報があります:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

于 2013-03-25T19:03:31.083 に答える
0

activerecord:throughオプションを使用する

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

于 2013-03-25T17:00:59.147 に答える
0

STI- 単一テーブル継承を使用できます。このためには、のを格納するtype属性をモデルに含める必要があります。PersontypePerson

class Person < ActiveRecord::Base
end

class Actor < Person
end

class Writer < Person
end

class Producer < Person
end
于 2013-03-25T17:02:46.250 に答える
0

すべてのロールが同じ属性を持っているため、同じクラスとモデルを使用できると仮定します。同時に複数の役割を持ちたい場合、私の理解への最善の策は、Personモデルで属性の役割を使用することです。has_manyアソシエーションを使用できます。

于 2013-03-25T18:57:01.600 に答える