关联这些模型的最佳方式?

时间:2014-06-06 20:04:03

标签: ruby-on-rails activerecord

我有四个模特,电影,人物,演员和船员,我不确定什么是将它们联系在一起的最佳方式。我应该使用多个通过关联或坚持下面的关联?任何建议都将不胜感激。

我希望能够访问电影对象的节目页面,然后能够列出与电影相关的适当的演员和工作人员。此外,当我访问一个人的节目页面时,我想列出所有他们的演员角色电影,此外,如果他们是剧组的一部分。

class Movie < ActiveRecord::Base
  has_many :cast
  has_many :crew
end

class Person < ActiveRecord::Base
  has_many :cast
  has_many :crew
end

class Cast < ActiveRecord::Base
  belongs_to :movie
  belongs_to :person
end

class Crew < ActiveRecord::Base
  belongs_to :movie
  belongs_to :person
end

1 个答案:

答案 0 :(得分:2)

class Movie < ActiveRecord::Base
  has_many :cast_memberships
  has_many :crew_memberships
  has_many :cast_members, :through => :cast_memberships, :source => :person
  has_many :crew_members, :through => :crew_memberships, :source => :person

  alias_method :cast, :cast_members
  alias_method :crew, :crew_members
end

class CastMembership < ActiveRecord::Base
  belongs_to :movie
  belongs_to :person
end

class CrewMembership < ActiveRecord::Base
  belongs_to :movie
  belongs_to :person
end

class Person < ActiveRecord::Base
end

class CastMember < Person
  has_many :cast_memberships, :foreign_key => :person_id
  has_many :roles, :through => :cast_memberships, :source => :movie
end

class CrewMember < Person
  has_many :crew_memberships, :foreign_key => :person_id
  has_many :jobs, :through => :crew_memberships, :source => :movie
end

> movie = Movie.create! name:"Star Wars"
> cast_member = CastMember.create! name:"Harrison Ford"
> movie.cast << cast_member
> movie.cast # [{name: "Harrison Ford"}]
> cast_member.roles # [{name: "Star Wars"}]

这并不是你所需要的 - cast_member.roles应该返回角色([&#34; Han Solo&#34;])而不是电影。您可以为cast_membershipscrew_memberships表添加属性以获取字符数据或作业说明。

相关问题