我在Ruby(而不是Rails)应用程序中有两个模型:Bill
和BillItem
。我使用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
)。我很难过,这里发生了什么?
答案 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') }
注意:
如果查询匹配多个记录,则find_by
将仅获取第一个记录,而忽略其他记录。默认情况下,它在其查询中实现LIMIT 1
。
字母/值/输入区分大小写。 Fair
和fair
是完全不同的字母/值/输入,因此请确保仔细检查您的值字母/值/输入,以避免不必要的调试时间。
合并范围
如果您需要在其他模型中使用此范围,请说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文档。仅此而已
我希望这会有所帮助