我有电影模型和人模型。
电影模型应该包含演员,作家和制片人组。
演员,作家和制片人都是一群人,都来自同一个人模型。
对此进行建模的最佳方式是什么?
感谢。
编辑:每个人可以同时成为演员,作家和制片人。它们都具有相同的属性。编辑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
并在Movie模型中创建组,所以我可以像这样调用它们:
@writers = @movie.writers
@actors = @movie.actors
@producers = @movie.producers
所有由Person对象组成的人,可以是3种类型中的任何一种。
一个人可以参与其他许多电影。
答案 0 :(得分:1)
这完全取决于你的演员,作家和制作人的属性有多么不同。如果它们都具有相同的属性(或大多数相同的属性),则可以使用单表继承。让Person模型中的一个属性成为名为type
的属性,这将触发STI。
是否使用STI取决于您对数据库中空值的容忍度。如果演员,作家和制作人之间的共享属性数量很少,那么你最终会得到一些空值,而且每个属性都有不同的类。
官方文档仅限于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/
答案 1 :(得分:1)
如果您不想要不同的型号,为什么不在您的个人(或电影)模型中添加专业列?假设它们具有几乎相同的属性,它们都可以由同一个表处理。您可以使用multiple:true,以允许每个人选择多个职业。
P.S。你能详细说明为什么你为这些职业使用单独的电影模型吗?
修改强>
如果你有很多职业并且一个人可以同时拥有多个职业,你可以考虑使用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
这样,如有必要,您可以在连接模型中添加其他属性。
答案 2 :(得分: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
条件内的条件将根据您实施角色分配的方式而有所不同。
您在此处拥有所有信息:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
答案 3 :(得分:0)
使用activerecord :through
选项
http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
答案 4 :(得分:0)
您可以使用STI - 单表继承。为此,您需要在type
模型中设置Person
属性,该属性将存储type
的{{1}}。
Person
答案 5 :(得分:0)
鉴于所有角色都具有相同的属性,因此可以使用相同的类和模型。如果你想同时拥有多个角色,我最好的理解是在Person模型中使用一个属性角色。您可以使用has_many关联。