我目前正在制作一个运行在ruby on rails上的网站。我在尝试连接两个表(rates和locations)时遇到了一些问题,这两个表有两个不同的属性名。
速率:id rater_id rateable_id
(以及此表中的其他一些属性)
位置:id title body user_id
(以及此表中的其他一些属性)
这是我试图在sql中执行的查询。
SELECT *
FROM rates, locations
WHERE rates.rater_id = locations.user_id AND rates.rateable_id = locations.id
我已经阅读了rubyonrails.org提供的官方活动记录文档。我试过做这些,但没用这是我试图植入的代码
app\controllers\users_controller.rb
@join_rating = Rate.joins(:locations).where("rates.rateable_id = locations.id AND rates.rater_id = locations.id")
@all_rating = @all_rating.where(rater_id: @user)
@count_all_rating = @all_rating.count
@join_rating
,正在尝试用不同的名称连接属性。@all_rating
,正在尝试使用用户ID筛选要显示的位置@join_rating
,正在尝试计算用户评分的位置总数假设所有设置都正确,唯一的错误是在我试图执行的查询中,我应该如何重写该语句,以便能够显示用户使用
@all_rating
评分的位置。谢谢您!
最佳答案
有几点:
当在ActiveRecord中使用Rate
类开始一个语句时,这意味着结果将是Rate
对象的集合因此,如果您试图显示位置,应该从Location
类开始。
@locations_user_rated=Location.joins('内部连接速率
rates.rateable_id=locations.id').where('rates.rater_id'=>@用户)
如果您的activerecord关联定义良好,那么您只需执行以下操作:
@locations_user_rated=location.joins(:rates).where('rates.rater_id'=>@用户)
“定义良好”就是说你需要做如下的事情。请注意,我不确定我是否正确理解您的模型关系。我在下面假设每个位置都有多个速率,而您的Rate
模型之所以有一个名为rateable_id
的字段,而不是一个location_id
的字段,是因为您希望:rateable
是polymorphic这意味着您可能在rateable_type
表中也有一个rates
字段。
class Location < ActiveRecord::Base
has_many :rates, as: :rateable
end
class Rate < ActiveRecord::Base
belongs_to :rateable, polymorphic: true
end
如果这种多态性不是这样的话,事情实际上应该简单一些,我强烈建议您遵循Rails的惯例,只需在
location_id
模型上命名relationship字段Rate
,而不是rateable_id
然后你可以:class Location < ActiveRecord::Base
has_many :rates
end
class Rate < ActiveRecord::Base
belongs_to :location
end
如果仍然不确定字段名,可以自定义内容并执行以下操作:
class Location < ActiveRecord::Base
has_many :rates, foreign_key: :rateable_id
end
class Rate < ActiveRecord::Base
belongs_to :location, foreign_key: :rateable_id
end
有关如何自定义关联here和here的详细信息。