gpt4 book ai didi

sql - 如何在 Ruby on Rails Controller 中手动连接两个具有不同属性名称的不同表

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:21 25 4
gpt4 key购买 nike

我目前正在制作一个在 Ruby on Rails 上运行的网站。我在尝试加入两个表时遇到了一些问题,RatesLocations,我有两个不同的属性名称。

费率: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

我已经阅读了 ruby​​onrails.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('INNER JOIN rates ON rates.rateable_id = locations.id').where('rates.rater_id' => @user)

如果您的 ActiveRecord 关联定义明确,您可以简单地执行以下操作:

@locations_user_rated = Location.joins(:rates).where('rates.rater_id' => @user)

“定义明确”仅表示您需要执行以下操作。请注意,我不确定我是否正确理解您的模型关系。我在下面假设每个位置都有多个费率,并且您的 Rate 模型具有名为 rateable_id 而不是 location_id 的字段的原因是因为您想要 :rateablepolymorphic .这意味着您可能在 rates 表中也有一个 rateable_type 字段。

class Location < ActiveRecord::Base
has_many :rates, as: :rateable
end

class Rate < ActiveRecord::Base
belongs_to :rateable, polymorphic: true
end

如果这种多态性不是这种情况,事情实际上应该更简单,我强烈建议您遵循 Rails 的约定,只需将 Rate 上的关系字段命名为 location_id模型而不是 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 .

关于sql - 如何在 Ruby on Rails Controller 中手动连接两个具有不同属性名称的不同表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36948649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com