我正在尝试根据两个相关属性找到记录。如果记录的关联包含这两个记录,则应选择记录。
到目前为止,我尝试过以下操作 - 在我看来这是一种非常糟糕的做法,我想避免使用它。
@size = Spree::OptionValue.find(params[:size])
@color = Spree::OptionValue.find(params[:color])
vari = Spree::Variant.all
vari.each do |va|
if va.option_values.include?(@size && @color)
@variant = va
end
end
到目前为止,我还试过
@variant = Spree::Variant.all(:include => :option_values, :conditions => ['option_value.id = ?', params[:color])
这似乎是要走的路,但我似乎无法找到获得结果的正确方法。 我不断得到的返回错误如下:
ActiveRecord :: StatementInvalid:PG ::错误:错误:缺少表“option_values”的FROM子句条目 第1行:..._ option_values_variants“。”option_value_id“WHERE(option_val ...
编辑:
我得到了它的工作,因为在接受的答案中给予了很大的帮助:
Spree::Variant.joins(:option_values).where("spree_option_values.id in (?)", [size, color])
答案 0 :(得分:1)
首先,您的代码可能已损坏。我怀疑.include?(@size && @color)
做了你认为它做的事情;您实际上只是检查option_values
是否包含@color
。这相当于做(true && @color)
。如果您想要包含两个值,则需要.include?(@size) && .include?(@color)
。
所以你的代码应该是这样的:
vari = Spree::Variant.all
vari.each do |va|
if va.option_values.include?(@size) && va.option_values.include?(@color)
@variant = va
end
end
接下来,您可以使您的代码更像Ruby-esque:
@variant = Spree::Variant.all.select do |v|
v.option_values.include?(@size) && v.option_values.include?(@color)
end
但实际上在数据库级别评估条件而不是将整个表加载到应用程序中要好得多。您似乎正在查找关联的OptionValue
包含您在@size
和@color
中选择的两个记录的所有记录。
您正在寻找的查询可能如下所示:
Spree::Variant.joins(:option_values).where("option_values.id in (?)", [@size, @color])