次の問題があります。私は、渡された配列(またはこの場合はハッシュのキー)から名前を取って、モデル内に一定量のhas_many関係を設定したいと思います。このように:some_object.foo_objects
& some_object.bar_objects
:Rails 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_objects
とbar_objects
の両方は、スコープがwhere(var: "bar")
のオブジェクトのセットを返します。
通常、lambdaはhas_manyリレーションの動的スコープを渡すのに最適ですが、この場合は本当に必要ありません。 has_many関係の中に静的スコープを設定することは可能ですか?
をはい、これは動作します!このソリューションとArtOfCodeの両方の答えはうまくいきますが、私はこのソリューションが少し優雅だと思っています。私は理由は分かりません。このループと私が使用したループの違いは何ですか?私はあなたが同じ問題で終わるだろうと言いますが、何らかの理由でこれが機能し、私のコードではありません。まぁ。ありがとう! :) –
@KobusPostモバイルから入力している瞬間、私は眠っていますが、明日、あなたが持っていたものが何か間違っていたかどうかをチェックして説明します(私は告白すべきです - Rubyのforループ、一度も.. :)) –