我目前正在制作一个运行在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的字段,是因为您希望:rateablepolymorphic这意味着您可能在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

有关如何自定义关联herehere的详细信息。

10-04 10:13