为什么我收到ActiveRecord错误"缺少FROM-clause条目表#34;?

时间:2014-12-14 00:38:38

标签: ruby-on-rails ruby postgresql activerecord

我在Ruby(而不是Rails)应用程序中有两个模型:BillBillItem。我使用ActiveRecord尝试查找Bills BillItem属性为user_id的所有1

bill.rb

class Bill < ActiveRecord::Base
  has_many :bill_items
end

bill_item.rb

class BillItem < ActiveRecord::Base
  belongs_to :bill
end

我已尝试过以下ActiveRecord查询:

Bill.where('bill_items.user_id = 1')
Bill.where(bill_items: { user_id: 1 })

两者都会导致错误:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry
for table 'bill_items'

LINE 1: SELECT "bills".* FROM "bills"  WHERE "bill_items"."user_id" ...
                                             ^

: SELECT "bills".* FROM "bills"  WHERE (bill_items.user_id = 34)

在SO上也有类似的问题,但大多数似乎都存在命名问题(指代bill_item而不是bill_items)。我很难过,这里发生了什么?

2 个答案:

答案 0 :(得分:0)

如评论中所述,您需要加入另一个表:

Bill.joins(:bill_items).where('bill_items.user_id' => 1)

答案 1 :(得分:0)

在Rails 6应用程序上工作时,我也面临着同样的挑战。

我有一个模型Product属于另一个名为Badge的模型。

产品型号

class Product < ApplicationRecord
  belongs_to :badge
end

徽章模型

class Badge < ApplicationRecord
  has_many :products
end

我想定义一个范围,仅显示产品的徽章名称Fair ,但是,我遇到了一个错误:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry
for table 'badges'

这是我的解决方法

您可以在Active Record关系中使用where子句来从多个表中检索经过过滤的数据

scope :best_sellers, -> { Product.joins(:badge).where('badges.name': 'Fair') }

OR

您可以在Active Record关系中使用find_by子句从多个表中检索特定数据

scope :best_sellers, -> { Product.joins(:badge).find_by('badges.name': 'Fair') }

注意

  1. 如果查询匹配多个记录,则find_by将仅获取第一个记录,而忽略其他记录。默认情况下,它在其查询中实现LIMIT 1

  2. 字母/值/输入区分大小写。 Fairfair是完全不同的字母/值/输入,因此请确保仔细检查您的值字母/值/输入,以避免不必要的调试时间。

合并范围

如果您需要在其他模型中使用此范围,请说Home,而不是这样复制它:

class Home < ApplicationRecord
    scope :best_sellers, -> { Product.joins(:badge).where('badges.name': 'Fair') }
end

您只需使用此概念即可使其干燥

class Home < ApplicationRecord
  # This scope are from the Product model
  scope :best_products, -> { best_sellers }
end

这可以帮助您避免代码重复,从而可以只在一个地方进行代码更改。

您可以在Understanding The Method Chaining

上阅读 Rails文档

仅此而已

我希望这会有所帮助