2010-01-02 3 views
0

Я борюсь с ассоциацией has_many. У меня есть дневниковая заявка. В модели игроков следующим образом:Связь 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
  • user_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, но я уверен, что это может работать с ассоциациями.

ответ

0

Не является ли «другом» просто другим пользователем, находящимся в базе данных?

Позвольте вашему UserFriend быть отношениям many_to_many (с «has_and_belongs_to_many» или «has_many: through»): каждый пользователь может иметь нескольких пользователей в качестве друзей. Затем вы можете связать те user_ids (которые могут быть в таблице many_to_many, называемые «friend_id», если хотите) в их foodprofile без проблем, поскольку она использует ту же ссылку, что и user.foodprofile.

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" 

Doing это, все ты необходимо сделать user.friends.profiles довольно легко.

Теперь, если отношения двунаправлены, это становится немного сложнее, но я чувствую, что это должно по крайней мере заставить вас начать путь.

Смежные вопросы