2014-09-26 5 views
1

Я пытаюсь выполнить следующее в моем рубине на приложении rails. Это также мой макет базы данных и имена моделей. IllustationRuby on Rails Двунаправленные ассоциации

Однако, это действительно не работает для меня.

модель Пользователь:

class User < ActiveRecord::Base 
    has_many :follows 
    has_many :users, :through => :follows 
end 

Последующая модель:

class Follow < ActiveRecord::Base 
    belongs_to :user, :foreign_key => :follow_user_id 
end 

Я использую это для отладки:

<% current_user.follows.each do |x| %> 
    <%= debug x.user %> 
<% end %> 

Debug

Я понятия не имею, как это сделать другим способом и я даже не уверен, что я делаю это правильно. Любая помощь оценивается.

+1

Вы хотите иметь дело с «is_followed_by»? –

+1

Взгляните на это: http://stackoverflow.com/questions/3397920/relationship-like-twitter-followers-followed-in-activerecord или этот http://stackoverflow.com/questions/6762919/ruby-on -rails-has-many-through-self-referential-follow-follower-relations – MrYoshiji

+0

Просто посмотрел и да, вот что я ищу. – Mike

ответ

1

У вас есть правильная идея, вы просто не закончили ассоциации. Во-первых, обратите внимание на то, что Пользователь подключается дважды к следующему - в каждом направлении.

rails g model User email:string name:string 
rails g model Follow user:references follow_user:references 

Тогда:

class User < ActiveRecord::Base 
    has_many :follows, inverse_of: :user 
    has_many :followers, through: :follows 

    has_many :followings, class_name: 'Follow', foreign_key: :follow_user_id, inverse_of: :follower 
    has_many :users_i_follow, through: :followings, source: :user 
end 

class Follow < ActiveRecord::Base 
    belongs_to :user, inverse_of: :follows 
    belongs_to :follower, inverse_of: :followers, class_name: 'User', foreign_key: :follow_user_id 
end 

Теперь для пользователя у вас есть две ассоциации, которые вы, вероятно, в основном используют: "последователей" и "users_i_follow".

mdchaney$ bundle exec rails c 
Loading development environment (Rails 4.1.5) 
2.1.1 :001 > u = User.create(:email => '[email protected]', :name => 'Leader Guy') 
=> #<User id: 1, email: "[email protected]", name: "Leader Guy", created_at: "2014-09-26 18:48:52", updated_at: "2014-09-26 18:48:52"> 

2.1.1 :002 > u2 = User.create(:email => '[email protected]', :name => 'Follower Guy') 
=> #<User id: 2, email: "[email protected]", name: "Follower Guy", created_at: "2014-09-26 18:49:13", updated_at: "2014-09-26 18:49:13"> 

2.1.1 :003 > u3 = User.create(:email => '[email protected]', :name => 'Follower Guy, III') 
=> #<User id: 3, email: "[email protected]", name: "Follower Guy, III", created_at: "2014-09-26 18:49:25", updated_at: "2014-09-26 18:49:25"> 

2.1.1 :004 > u.followers 
=> #<ActiveRecord::Associations::CollectionProxy []> 

2.1.1 :005 > Follow.create(:user => u, :follower => u2) 
=> #<Follow id: 1, user_id: 1, follow_user_id: 2, created_at: "2014-09-26 18:50:12", updated_at: "2014-09-26 18:50:12"> 

2.1.1 :006 > Follow.create(:user => u, :follower => u3) 
=> #<Follow id: 2, user_id: 1, follow_user_id: 3, created_at: "2014-09-26 18:50:14", updated_at: "2014-09-26 18:50:14"> 

2.1.1 :007 > u = User.find(1) 
=> #<User id: 1, email: "[email protected]", name: "Leader Guy", created_at: "2014-09-26 18:48:52", updated_at: "2014-09-26 18:48:52"> 

2.1.1 :008 > u.followers 
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 2, email: "[email protected]", name: "Follower Guy", created_at: "2014-09-26 18:49:13", updated_at: "2014-09-26 18:49:13">, #<User id: 3, email: "[email protected]", name: "Follower Guy, III", created_at: "2014-09-26 18:49:25", updated_at: "2014-09-26 18:49:25">]> 

2.1.1 :009 > u.follows 
=> #<ActiveRecord::Associations::CollectionProxy [#<Follow id: 1, user_id: 1, follow_user_id: 2, created_at: "2014-09-26 18:50:12", updated_at: "2014-09-26 18:50:12">, #<Follow id: 2, user_id: 1, follow_user_id: 3, created_at: "2014-09-26 18:50:14", updated_at: "2014-09-26 18:50:14">]> 

2.1.1 :010 > u2 = User.find(2) 
=> #<User id: 2, email: "[email protected]", name: "Follower Guy", created_at: "2014-09-26 18:49:13", updated_at: "2014-09-26 18:49:13"> 

2.1.1 :011 > u2.followers 
=> #<ActiveRecord::Associations::CollectionProxy []> 

2.1.1 :012 > u2.follows 
=> #<ActiveRecord::Associations::CollectionProxy []> 

2.1.1 :013 > u2.followings 
=> #<ActiveRecord::Associations::CollectionProxy [#<Follow id: 1, user_id: 1, follow_user_id: 2, created_at: "2014-09-26 18:50:12", updated_at: "2014-09-26 18:50:12">]> 

2.1.1 :014 > u2.users_i_follow 
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1, email: "[email protected]", name: "Leader Guy", created_at: "2014-09-26 18:48:52", updated_at: "2014-09-26 18:48:52">]>