不止一次拥有其他模型的模型

时间:2013-03-25 16:49:26

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我有电影模型和模型。

电影模型应该包含演员,作家和制片人组。

演员,作家和制片人都是一群人,都来自同一个模型。

对此进行建模的最佳方式是什么?

感谢。

编辑:每个人可以同时成为演员,作家和制片人。它们都具有相同的属性。

编辑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种类型中的任何一种。

一个人可以参与其他许多电影。

6 个答案:

答案 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)

答案 4 :(得分:0)

您可以使用STI - 单表继承。为此,您需要在type模型中设置Person属性,该属性将存储type的{​​{1}}。

Person

答案 5 :(得分:0)

鉴于所有角色都具有相同的属性,因此可以使用相同的类和模型。如果你想同时拥有多个角色,我最好的理解是在Person模型中使用一个属性角色。您可以使用has_many关联。