我需要基于一些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} }
答案 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? }