5.3.1创建评论模型,直接关联

我们给电影网站添加一个用户评论的模型Review。首先看一下模型之间的关系。

一个评论属于且只属于一个评论者,一个评论者评论0或多部电影,一个评论所评论的电影有且仅有一部,一部电影有0到多个评论

rails generate model Review potatoes:integer comments:text moviegoer:references movie:references
rake db:migrate

生成的模型自动反应了上述的外键关系,如app/models/review.rb

class Review < ApplicationRecord
  belongs_to :moviegoer
  belongs_to :movie
end

修改app/models/movie.rb添加如下一行

has_many :reviews

修改app/models/moviegoer.rb添加如下一行

has_many :reviews

5.3.2间接关联

修改app/models/moviegoer.rb添加如下一行,实现查询影评人评论的所有电影

has_many :movies, through: :reviews

app/models/review.rb关联对象的校验

class Review < ApplicationRecord
  belongs_to :moviegoer
  belongs_to :movie

  # review is valid only if it's associated with a movie:
  validates :movie_id, :presence => true
  # can ALSO require that the referenced movie itself be valid
  #  in order for the review to be valid:
  validates_associated :movie
end

5.3.3关联的REST路由

修改config/routes.rb,电影movie包含评论review,因此用下述方式表示评论

  resources :movies do
    resources :reviews
  end

这样,我们得到路由如下

movie_reviews_path GET /movies/:movie_id/reviews(.:format) reviews#index
POST /movies/:movie_id/reviews(.:format) reviews#create
new_movie_review_path GET /movies/:movie_id/reviews/new(.:format) reviews#new
edit_movie_review_path GET /movies/:movie_id/reviews/:id/edit(.:format) reviews#edit
movie_review_path GET /movies/:movie_id/reviews/:id(.:format) reviews#show
PATCH /movies/:movie_id/reviews/:id(.:format) reviews#update
PUT /movies/:movie_id/reviews/:id(.:format) reviews#update
DELETE /movies/:movie_id/reviews/:id(.:format)