按关联查询和对模型的影响

时间:2014-12-18 23:01:52

标签: postgresql associations rails-activerecord model-associations

我目前有以下型号:

class User < ActiveRecord::Base
  has_many :locations
  has_many :reviews
end

class Location < ActiveRecord::Base
  belongs_to :user
  has_many :reviews
end

class Review < ActiveRecord::Base
  belongs_to :user
end

我希望能够查询Reviews.where(blah blah),然后按位置模型中的列进行过滤。

我有两个问题。 1.我是否需要更新我的模型才能启用此功能? 2.如果我更改了我的模型,它是否会破坏我今天在数据库中已有的当前记录?

这是我猜测我需要的更新型号。

class User < ActiveRecord::Base
  has_many :locations
  has_many :reviews, through: :locations
end

class Location < ActiveRecord::Base
  belongs_to :user
  has_many :reviews
end

class Review < ActiveRecord::Base
  belongs_to :user
  belongs_to :location
end

任何文章或帮助都将非常感谢!

1 个答案:

答案 0 :(得分:0)

你做你的模型的方式感觉就像用户拥有的位置,我会以不同的方式做到:

class User < ActiveRecord::Base
  has_many :reviews
  has_many :visited_places, through: :reviews, source: :location
end

class Location < ActiveRecord::Base
  has_many :reviews
end

class Review < ActiveRecord::Base
  belongs_to :location
  belongs_to :user
  accepts_nested_attributes_for :location, :user
  attr_accessible :description, :rank, etc....
end

通过这种方式,用户可以通过评论获得多个位置,您可以说这些位置是他访问过的地方。 一个位置可以有很多评论,但当然不属于任何用户。 评论由用户撰写并涉及到某个地方。

使用此模型,您可以获取由给定用户编写的或与特定位置相关的所有评论,例如Review.joins(:user).where(用户名:“toto”)或Review.joins(:location) .where(location_name:“Hong Kong”)