0

我有一个Movie模型和一个Person模型。

电影模型应该有演员、作家和制片人组

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

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

谢谢。

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

编辑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

鉴于您可以做的新信息

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 回答
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 /

于 2013-03-25T17:01:34.023 回答
1

如果您不想要不同的模型,为什么不在您的人物(或电影)模型中添加一个职业列呢?假设它们具有几乎相同的属性,它们都可以由同一张表处理。您可以使用 multiple: true 来允许每人选择多个职业。

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 回答
0

假设所有角色都具有相同的属性,因此可以使用相同的类和模型。如果您想同时拥有多个角色,据我所知,最好的选择是在 Person 模型中使用属性角色。您可以使用 has_many 关联。

于 2013-03-25T18:57:01.600 回答
0

使用 activerecord:through选项

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

于 2013-03-25T17:00:59.147 回答
0

您可以使用STI - 单表继承。为此,您需要type在模型中具有属性,该属性Person将存储.typePerson

class Person < ActiveRecord::Base
end

class Actor < Person
end

class Writer < Person
end

class Producer < Person
end
于 2013-03-25T17:02:46.250 回答