使用Rails更正电影网站的模型数据结构

时间:2011-01-12 01:26:49

标签: ruby-on-rails database-design

我需要保存一堆与电影无关的人,而不会重复。

让我们以电影 Inglourious Basterds 为例。

这里 Quentin Tarantino 有很多角色。

  • 作家
  • 演员

这是一个rspec测试的例子

Movie.find_by_title("Inglourious Basterds").actors.map(&:name).should include("Quentin Tarantino")
Movie.find_by_title("Inglourious Basterds").writers.map(&:name).should include("Quentin Tarantino")
Movie.find_by_title("Inglourious Basterds").directors.map(&:name).should include("Quentin Tarantino")

我应该如何建立模型之间的关系?

1 个答案:

答案 0 :(得分:1)

这是一套相当简单的rails模型。

rails g model movie name:string
rails g model person name:string
rails g model movie_role movie:belongs_to person:belongs_to role:string

对于模型协会:

class Person < ActiveRecord::Base
  has_many :movie_roles
  has_many :movies, :through => :movie_roles
end

class Movie < ActiveRecord::Base
  %w(actor director writer).each do |type|
    base = "#{type}_movie_roles"
    has_many base, :conditions => { :role => type }, :class_name => 'MovieRole'
    has_many type.pluralize, :through => base, :source => :person
  end
end