0

has_manyアソシエーションに苦労しています。日記をつけています。モデルプレイヤーは以下の通りです。

  • ユーザー
  • UserFriend
  • UserFoodProfile

ユーザーの友達が食べた食べ物を全部手に入れたいです。だから、私は得ることができるようにしたいと思います:current_user.friends.profiles

これまで、にアクセスできるように関連付けを適切に設定しましたcurrent_user.friendsが、過去30日間のすべての友達のエントリも取得できるようにしたいと考えています。

これが私のモデルです

class User < ActiveRecord::Base

  cattr_reader :per_page
  @@per_page = 20

  has_many  :user_food_profiles
  has_many  :preferred_profiles
  has_many  :food_profiles, :through => :user_food_profiles
  has_many  :weight_entries
  has_one   :notification
  has_many  :user_friends
  has_many  :friendships, :class_name => "UserFriend", :foreign_key => "friend_id"
  has_many  :friends, :through => :user_friends

class UserFriend < ActiveRecord::Base

  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"

class UserFoodProfile < ActiveRecord::Base
  belongs_to :user
  belongs_to :food_profile
  belongs_to :post

UserFriendモデルは、次のように設定されます。

  • id
  • ユーザーID
  • friend_id
  • friend_name

user_food_profilesユーザーの友達の現在の情報を「エントリ」として取得できるように、友達から接続したいのですが、user_food_profiles試したすべてがうまくいきませんでした。この関連付けをどのように設定しますか?

やろうとした:

  • UserFriend:has_many :user_food_profiles, :as => 'entries'
  • UserFoodProfile:belongs_to :friend, :foreign_key => 'friend_id'

これを機能させる方法について何かアイデアはありますか?カスタムfinder_sqlを作成したいのですが、これは関連付けで機能すると確信しています。

4

2 に答える 2

0

「友達」は、データベースにある別のユーザーではありませんか?

UserFriend を many_to_many の関係 (「has_and_belongs_to_many」または「has_many :through」のいずれか) にします: 各ユーザーは複数のユーザーを友達として持つことができます。user.foodprofile と同じリンクを使用しているため、これらの user_ids (必要に応じて「friend_id」と呼ばれる many_to_many テーブルにある可能性があります) を foodprofile にリンクできます。

于 2010-01-06T17:57:17.433 に答える
0

これは私が問題であると思う行です:

class User < ActiveRecord::Base
  # <snip/>
  has_many  :friendships, 
              :class_name => "UserFriend", 
              :foreign_key => "friend_id"

ここでは、user_friend という結合テーブルを使用していると想定しています。つまり、そこにある外部キーは「user_id」でなければなりません。

UserFriend モデルに追加のメタデータを保存する場合を除き、これは必須ではありません。次のhas_and_belongs_to_manyような自己参照関係を使用できます。

has_and_belongs_to_many :friends, 
                          :class_name => "User", 
                          :join_table => "user_friends", 
                          :foreign_key => "user_id", 
                          :association_foreign_key => "friend_id"

これを行うと、あなたがしなければならないことはuser.friends.profiles非常に簡単です。

さて、関係が双方向の場合はもう少し複雑になりますが、これで少なくとも途中で始めることができると思います.

于 2010-01-14T10:36:34.170 に答える