[解決済み] ActiveRecord、has_many :through, そしてポリモーフィックアソシエーション
2022-05-14 19:01:48
質問
皆さん。
私がこれを正しく理解していることを確認したいと思います。そして、ここ(SentientBeing)での継承のケースは無視し、代わりにhas_many :through 関係のポリモーフィックモデルに焦点を当てようとしてください。とはいえ、次のように考えてみてください...
class Widget < ActiveRecord::Base
has_many :widget_groupings
has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'"
has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'"
end
class Person < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end
class Alien < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end
class WidgetGrouping < ActiveRecord::Base
belongs_to :widget
belongs_to :grouper, :polymorphic => true
end
完璧な世界では、WidgetとPersonが与えられたら、次のようなことをしたい。
widget.people << my_person
しかし、これを実行すると、widget_groupingsの中で、「グルーパー」の「タイプ」が常にnullになっていることに気づきました。しかし、私は次のようなものにすると。
widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})
そして、すべてが私が通常期待するように動作します。多形でない関連付けでこれが発生するのを見たことがないので、これがこの使用ケースに特有のものであるかどうか、または私が潜在的にバグを見つめているのかどうかを知りたかっただけなのです。
どんな助けでもありがとうございます!
どのように解決するのですか?
には 既知の問題 があり、この機能はRails 3.1.1では壊れます。この問題がある場合、まずアップグレードを試してみてください。
あと少しです。問題は :source オプションの使い方を間違えていることです。 :source はポリモーフィックな belongs_to 関係を指すはずです。そうすると、定義しようとしている関係に対して :source_type を指定すればいいだけです。
Widgetモデルへのこの修正により、あなたが探しているものを正確に行うことができるようになるはずです。
class Widget < ActiveRecord::Base
has_many :widget_groupings
has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person'
has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien'
end
関連
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] Rubyで変数をインクリメントする [重複]。
-
[解決済み] DestroyとDeleteの違い
-
[解決済み] Errno::EACCESS: パーミッションが拒否された @ dir_s_mkdir
-
[解決済み] Rails ExecJS::ProgramError in Pages#home?
-
[解決済み] Ruby on Railsでsimple_formを使うさまざまな方法|何が違うの?
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜ?
-
[解決済み] Ruby:Rubyの配列にinclude.の反対はある?
-
[解決済み] Ruby on rails アプリで ES6 (ES2015) を使用するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] サーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません (PG::ConnectionBad)
-
[解決済み】コントローラでJSONをレンダリングする
-
[解決済み】Webpacker::Manifest::MissingEntryError【クローズド
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] Railsです。NameError: 初期化されていない定数
-
[解決済み] 検索 vs 発見する by vs どこに
-
[解決済み] ルビーオンレール モデルから明確な値を選択する
-
[解決済み] Ruby on rails アプリで ES6 (ES2015) を使用するにはどうすればよいですか?
-
[解決済み] Ruby on Rails の新規セットアップ : "Expected string default value for '--rc'; got false (boolean)".
-
[解決済み] 属性とカラムの違いは何ですか?