根据相关属性查找记录

时间:2012-11-06 20:00:54

标签: ruby-on-rails activerecord spree

我正在尝试根据两个相关属性找到记录。如果记录的关联包含这两个记录,则应选择记录。

到目前为止,我尝试过以下操作 - 在我看来这是一种非常糟糕的做法,我想避免使用它。

@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])

1 个答案:

答案 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])
相关问题