has_many与非传统数据模型的关联

时间:2010-01-02 02:37:19

标签: ruby-on-rails associations 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,但我确信这可以与关联一起使用。

2 个答案:

答案 0 :(得分:0)

不是“朋友”只是数据库中的另一个用户吗?

让你的UserFriend成为many_to_many关系(使用“has_and_belongs_to_many”或“has_many:through”):每个用户可以有多个用户作为朋友。 然后,您可以将这些user_id(可以在many_to_many表中称为'friend_id',如果您愿意)链接到他们的foodprofile而没有问题,因为它使用与user.foodprofile相同的链接。

答案 1 :(得分: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非常容易。

现在,如果这种关系是双向的,那就会变得有点复杂,但我觉得这至少应该让你一路走来。