1

私は、ユーザーモデルとムービーモデルだけでなく、それらを格納するテーブルを持っているとしましょう。 watchlist_moviesという3番目のテーブルを追加してウォッチリスト機能を追加したいとしましょう。これは単にuser_idをmovie_idにマッピングします。Railsアソシエーションに特定の名前を使用して別の名前のモデルにアクセスさせるにはどうすればよいですか?

ここで、watchlist_movieモデルを追加します。私はuser.watchlist_moviesでActiveRecordを照会し、ムービーオブジェクトのコレクションを取得できるようにしたいと考えています。これまでのところ、私は(user.rbに)

has_many :watchlist_movies 

has_many :movies, through: watchlist_movies 

を試してみたの記録と第二を返すuser.watchlist_moviesの最初の結果がで映画のレコードのコレクションを返します。 user.movi​​es。基本的に私が望むのは、user.watchlist_moviesがムービーレコードのコレクションを返すことです。そのため、最初のリレーションシップで定義されたアクセス権を使用して、2番目のリレーションシップのコンテンツを返します。これはどうすればいいですか?

答えて

1

ここでは関係を正しく定義していますが、Railsの処理方法とは異なる場合があります。シンプルな結合モデルであるWatchlistMovieからUserに関連するムービーの構造であれば、正しい軌道に乗っています。それはActiveRecordのは、物事に名前を付けることを好むかの穀物に反するので、私はこれに対して助言するだろう

has_many :watchlist_movie_associations, 
    class_name: 'WatchlistMovie' 

has_many :watchlist_movies, 
    class_name: 'Movie', 
    through: :watchlist_movie_associations 

は、あなたが欲しい何でもあなたの関係を呼び出すことができます覚えておいてください。今はただのバグだと分かりますが、それは理解できますが、戦うのではなくスタイルを抱いていれば、より一貫して理解できるアプリケーションができます。

+0

私はこの関係をモデル化する最良の方法が何であるかについてはっきりしていません。あなたはhas_many:movies:watchlist_moviesが理想的だと言っていますか? –

+0

あなたのオリジナルの質問には教科書的なやり方があります。あなたに非常に正当な理由がない限り、名前の変更は避けてください。個人的な好みは、Railsの慣習と矛盾する場合、通常は無視されるべきです。一貫性は将来の驚きを少なくします。今は奇妙なことに気付くかもしれませんが、ほとんどのRails開発者はあなたのコードを正確に予想通りに見つけ出します。 'user.watchlist_movies'を呼び出してムービーモデルを元に戻すことは、あなたの命名規則に精通していない人にとっては本当に混乱します。 – tadman

+0

十分に公正。もし私がそのルートに行くなら、watchlist_moviesモデルを持っているべきですか?モデルなしの結合テーブルを持っていて、has_and_belongs_to_many結合を使用できませんでしたか? また、user.movi​​esを使用したくない理由の1つは、将来他のリストがある可能性があるからです。彼らは他の団体を通じて映画を持っていただろう。 –