rails查询必须满足所有条件的记录

时间:2016-12-10 15:54:17

标签: sql ruby-on-rails

我有以下关系:

class Variant < ActiveRecord::Base
     has_many :option_value_variants
     has_many :option_values, through: :option_value_variants
end

class OptionValueVariant < ActiveRecord::Base
    belongs_to :option_value
    belongs_to :variant
end

class OptionValue < ActiveRecord::Base
    has_many :option_value_variants
    has_many :variants, through: :option_value_variants
end

这是我的选项值变量数据库:

id  | variant_id | option_value_id
24  |     21     |        72
22  |     20     |        72
26  |     22     |        71
20  |     19     |        71
25  |     22     |        70
21  |     20     |        70

我在输入option_value_id作为参数后试图获取variant_id。 variant_id的条件是,它必须包含所有option_value_id。

下面是我的控制器的引用:

variant = OptionValueVariant.where(option_value_id: params[:variant][:option_value_ids]).uniq.pluck(:variant_id)

例如,如果我对option_value_id的参数是&#39; 72&#39; &安培; &#39; 70&#39;,我希望得到我的结果&#39; [20]&#39;因为这个variant_id同时具有&#39; 72&#39;的option_value_id。 &安培; &#39; 70

而是我得到一个&#39; [20,21,22]&#39;的数组,这不是我想要的,因为一些variant_id只有一个option_value_id。

我一直在寻找没有答案的日子,可能是我应该问的真正问题。

请协助并非常感谢所有帮助,

感谢。

2 个答案:

答案 0 :(得分:1)

解决问题的方法:

注意:此解决方案假设您没有两个相同外键组合的行,如下例所示。

id  | variant_id | option_value_id
22  |     20     |        72
22  |     20     |        72


variant = OptionValueVariant.where(option_value_id: params[:variant][:option_value_ids]).pluck(:variant_id)
variant.select {|i| variant.count(i) == params[:variant][: option_value_ids].uniq.count  }.uniq

答案 1 :(得分:0)

您正在尝试查找变体ID的intersection。对于要检查的每个OptionValue,您需要一组id。在你的情况下,你应该这样做:

def repeat(s):
    prefix_array=[]
    for i in range(len(s)):
        prefix_array.append(s[:i])
    #see what it holds to give you a better picture
    print prefix_array

    #stop at 1st element to avoid checking for the ' ' char
    for i in prefix_array[:1:-1]:
        if s.count(i) > 1 :
            #find where the next repetition starts
            offset = s[len(i):].find(i)

            return s[:len(i)+offset]
            break

    return s


print repeat(s)
  1. variant_ids是匹配variant_ids的数组。
  2. 然后添加一个匹配每个option_value_id
  3. 的ID数组
  4. 然后使用intersection(array&amp; array)查找所有数组中的id。 inject方法遍历所有数组并调用#&amp;对数组中每个项的方法。在这种情况下,它碰巧是另一个数组,并且您在每个数组上调用交集方法。
  5. 这将适用于至少有一个option_value_ids。