0

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

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

@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::Error: ERROR: missing FROM-clause entry for table "option_values" LINE 1: ..._option_values_variants"."option_value_id" WHERE (option_val...

编辑:

由于接受的答案提供了很大的帮助,我得到了它的工作:

Spree::Variant.joins(:option_values).where("spree_option_values.id in (?)", [size, color])
4

1 回答 1

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 风格:

@variant = Spree::Variant.all.select do |v|
  v.option_values.include?(@size) && v.option_values.include?(@color)
end

但是,在数据库级别实际评估条件要比将整个表加载到应用程序中要好得多。您似乎正在查找相关OptionValues 包括您选择的两个@size和的所有记录@color

您要查找的查询可能如下所示:

Spree::Variant.joins(:option_values).where("option_values.id in (?)", [@size, @color])
于 2012-11-06T20:22:10.237 回答