Rails 5 - 在查询中使用合成属性?

时间:2018-05-01 17:05:54

标签: ruby-on-rails-5

我不确定合成属性是否能够以这种方式使用,但我有一个带有两个布尔字段的帐户模型: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

1 个答案:

答案 0 :(得分:1)

预期会有这种行为。这里有两件事:

  1. 示例查询错误,因为 find_by_project_id 会返回第一个匹配的帐户记录,而不是一个集合来调用,其中

  2. 在您的情况下,您所要做的就是检索帐户记录,然后过滤它们:

    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)