我有以下关系:
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。
我一直在寻找没有答案的日子,可能是我应该问的真正问题。
请协助并非常感谢所有帮助,
感谢。
答案 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)
这将适用于至少有一个option_value_ids。