2016-11-02 9 views
2

次の問題があります。私は、渡された配列(またはこの場合はハッシュのキー)から名前を取って、モデル内に一定量のhas_many関係を設定したいと思います。このように:some_object.foo_objects & some_object.bar_objectsRails 4のhas_many内の静的スコープ

object_class_names = {:foo => FooClass, :bar => BarClass} 

for key_name in object_class_names.keys 
    has_many "#{key_name}_objects".to_sym, 
      -> {where(var: key_name)}, 
      :class_name => object_class_names[key_name] 
end 

これは、二つのhas_manyの関係になります。どちらも特定のclass_nameと特定のスコープを持ち、ラムダのwhere句に設定されています。しかし、スコープはラムダであるため、where句でkey_nameを動的に取得します。これは最後の既知のkey_name変数で、ループ内の最後の変数です(この場合は 'bar')。したがって、foo_objectsbar_objectsの両方は、スコープがwhere(var: "bar")のオブジェクトのセットを返します。

通常、lambdaはhas_manyリレーションの動的スコープを渡すのに最適ですが、この場合は本当に必要ありません。 has_many関係の中に静的スコープを設定することは可能ですか?

答えて

1

あなたがここにHash#each_pair使用する可能性があります:

object_class_names.each_pair do |key_name, klass| 
    has_many :"#{key_name}_objects", -> { where(var: key_name) }, class_name: klass.to_s 
end 
+0

をはい、これは動作します!このソリューションとArtOfCodeの両方の答えはうまくいきますが、私はこのソリューションが少し優雅だと思っています。私は理由は分かりません。このループと私が使用したループの違いは何ですか?私はあなたが同じ問題で終わるだろうと言いますが、何らかの理由でこれが機能し、私のコードではありません。まぁ。ありがとう! :) –

+0

@KobusPostモバイルから入力している瞬間、私は眠っていますが、明日、あなたが持っていたものが何か間違っていたかどうかをチェックして説明します(私は告白すべきです - Rubyのforループ、一度も.. :)) –

1

これは機能しますか?私はそれをテストしていませんが、最後に知られているキー名ではなく、あなたが望む特定のキー名にアクセスしているという理論です。

object_class_names.keys.each_with_index do |key_name, index| 
    has_many "#{key_name}_objects", 
      -> { where(:var => object_class_names.keys[index]) }, 
      :class_name => object_class_names[key_name] 
end 
関連する問題