gpt4 book ai didi

ruby-on-rails - 如何获得第一行的has_and_belongs_to_many关系postgresql

转载 作者:行者123 更新时间:2023-11-29 12:58:23 25 4
gpt4 key购买 nike

模型“battle”与模型“category”之间的关系是 has_and_belongs_to_many。我正在尝试查找与特定类别无关的所有战斗。到目前为止我尝试做的是:

Battle.all.includes(:categories).where("(categories[0].name NOT IN ('Other', 'Fashion'))")

发生此错误:ActiveRecord::StatementInvalid: PG::DatatypeMismatch: ERROR: cannot subscript type categories because it is not an array

谢谢,罗腾

最佳答案

categories[0].name 的使用不是对类别的 name 列的有效 SQL 引用。

试试这个:

Battle.includes(:categories).reject do |battle| 
['Other', 'Fashion'].include? battle.categories.map(&:name)
end

请注意,此代码执行两个查询 - 一个用于 Battle,一个用于 Category - 并预先将适当的 Category Active Record 对象加载到实例化的 Battle 记录的 :categories 关系。这有助于防止指南中描述的 in details 中的 N+1 查询。

另请注意,上面的代码首先将所有 Battle 记录加载到内存中,然后再消除具有不需要的类别的记录。根据您的数据,这可能令人望而却步。如果您更愿意限制 SQL 查询,以便只有相关的 ActiveRecord 对象被实例化,您可以使用类似以下的方法:

battle_ids_sql = Battle.select(:id).joins(:categories).where(categories: {name: ['Other' ,'Fashion']}).to_sql
Battle.where("id NOT IN (#{battle_ids_sql})")

battle_ids_sql 是一个 SQL 语句,它返回具有您不需要的类别之一的战斗 ID。实际执行的 SQL 获取所有不在该内部 SQL 中的 Battle 记录。它很有效,尽管很少使用——像这样的查询往往很难很快维护。

您可以了解joinsincludes 和其他两个相关方法(eager_loadpreload)here

关于ruby-on-rails - 如何获得第一行的has_and_belongs_to_many关系postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37014387/

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