Rails在Controller中查询模型定义的方法

时间:2019-02-27 01:59:03

标签: ruby-on-rails postgresql

我需要基于一些Table列属性和Model定义的方法在控制器中定义LineItems,但是我不知道该怎么写。

我的LineItem表包含一个opt_in布尔值。这很容易查询:

Controller:
def index
   @line_items = LineItems.where(opt_in: true)
end

但是我在line_item模型中也有一个方法,如下所示:

Model:
def cert_approved?
   if product.is_cert_approved?
     true
   else
     false
   end
end

因此,我需要查询已选择AND并且已通过admin_approved的LineItem。

类似的东西:

@line_items = LineItems.where(opt_in: true).where(cert_approved? true)

(但显然不行,因为那行不通)

我该怎么做?

product模型中的订单项的产品关系:

has_many :line_items, through: :variants_including_master

line_item模型中:

scope :cert_approved, -> { includes(:product).where spree_products: {is_cert_approved: true} }

2 个答案:

答案 0 :(得分:3)

同意第一个答案。 除了使用select,您还可以编写SQL查询,联接必要的表,然后像在范围内一样查询cert_approve。 另一个提示是,您可以像这样更优雅地编写cert_approved?

def cert_approved?
  product.is_cert_approved?
end

由于product.is_cert_approved?将返回一个布尔值,因此您不必指定它。

答案 1 :(得分:2)

如果您已经定义了scope :cert_approved,并且其逻辑与方法cert_approved?相同,则可以使用此查询。

@line_items = LineItems.cert_approved.where(opt_in: true)

如果您仍然想使用cert_approved?方法,则必须通过这样的select块传递它(性能比使用示波器慢)

@line_items = LineItems.where(opt_in: true).select { |l| l.cert_approved? }