我不确定合成属性是否能够以这种方式使用,但我有一个带有两个布尔字段的帐户模型:is_class_accout和:is_expense_account。
我创建了一个不存在于teh db中的属性,名为:is_synthetic,如果:is_class_account为true或者:is_expense_account为true,则返回true。
我想要做的是写一个像这样的查询:
Account.find_by_project_id(project_id).where(is_synthetic:true)
这会返回PG错误,因为生成的查询正在db中查找is_synthetic字段,当然它不在那里。
我做错了什么,或者这是预期的行为?
我使用的代码是:
class Account < ApplicationRecord
attribute :is_synthetic, :boolean
def is_synthetic
self.is_class_account || self.is_expense_account
end
答案 0 :(得分:1)
预期会有这种行为。这里有两件事:
示例查询错误,因为 find_by_project_id 会返回第一个匹配的帐户记录,而不是一个集合来调用,其中。
在您的情况下,您所要做的就是检索帐户记录,然后过滤它们:
class Account < ApplicationRecord
def is_synthetic
self.is_class_account || self.is_expense_account
end
end
# Returns an Array of accounts
Account.where(project_id: <queried_project_id>).select(&:is_synthetic)