gpt4 book ai didi

ruby-on-rails - 渴望加载多态

转载 作者:行者123 更新时间:2023-12-03 04:51:36 25 4
gpt4 key购买 nike

使用 Rails 3.2,这段代码有什么问题?

@reviews = @user.reviews.includes(:user, :reviewable)
.where('reviewable_type = ? AND reviewable.shop_type = ?', 'Shop', 'cafe')

它会引发此错误:

Can not eagerly load the polymorphic association :reviewable

如果我删除 reviewable.shop_type = ? 条件,它就会起作用。

如何根据 reviewable_typereviewable.shop_type(实际上是 shop.shop_type)进行过滤?

最佳答案

我的猜测是你的模型看起来像这样:

class User < ActiveRecord::Base
has_many :reviews
end

class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, polymorphic: true
end

class Shop < ActiveRecord::Base
has_many :reviews, as: :reviewable
end

由于多种原因,您无法执行该查询。

  1. 如果没有附加信息,ActiveRecord 无法构建连接。
  2. 没有名为可审核的表格

要解决此问题,您需要显式定义 ReviewShop 之间的关系。

class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, polymorphic: true
# For Rails < 4
belongs_to :shop, foreign_key: 'reviewable_id', conditions: "reviews.reviewable_type = 'Shop'"
# For Rails >= 4
belongs_to :shop, -> { where(reviews: {reviewable_type: 'Shop'}) }, foreign_key: 'reviewable_id'
# Ensure review.shop returns nil unless review.reviewable_type == "Shop"
def shop
return unless reviewable_type == "Shop"
super
end
end

然后你可以这样查询:

Review.includes(:shop).where(shops: {shop_type: 'cafe'})

请注意,表名称是 shops,而不是 reviewable。数据库中不应该有名为 reviewable 的表。

我相信这比在 ReviewShop 之间显式定义 join 更容易、更灵活,因为它允许您立即加载除了按相关字段查询之外。

这是必要的原因是 ActiveRecord 无法单独基于可审查来构建联接,因为多个表代表联接的另一端,而据我所知,SQL 不允许您联接名为的表存储在列中的值。通过定义额外关系 belongs_to :shop,您可以向 ActiveRecord 提供完成连接所需的信息。

关于ruby-on-rails - 渴望加载多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123492/

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