Ruby on Rails: восстановление дружбы с двумя пользователями - PullRequest
3 голосов
/ 18 июля 2011

Я видел Railscast по самореференциальным отношениям здесь: http://railscasts.com/episodes/163-self-referential-association

Я основывался на этом в том смысле, что я включил поле «статус» о дружбе, чтобы дружбу нужно было запрашивать и принимать. 'status' - логическое значение - false для еще не ответившего, true для принятого.

Моя проблема в том, чтобы придумать метод для поиска объекта дружбы с учетом current_user (я использую Devise) и другого пользователя.

Вот что мне доступно:

current_user.friends              # lists people you have friended
current_user.inverse_friends      # lists people who have friended you
current_user.friendships          # lists friendships you've created
current_user.inverse_friendships  # lists friendships someone else has created with you
friendship.friend                 # returns friend in a friendship

Я ищу способ, подобный следующему, чтобы я мог легко проверить статус дружбы:

current_user.friendships.with(user2).status

Вот мой код: user.rb

has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :user

friendship.rb

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

Пока я в этом - для отображения друзей пользователя мне нужно отобразить "current_user.friends" и "current_user.inverse_friends" - есть ли способ чтобы просто иметь возможность вызывать "current_user.friends" и быть ли это объединением двух?

1 Ответ

0 голосов
/ 18 июля 2011

Вы можете передать условия данной ассоциации следующим образом:

has_many :friends, :class_name => 'User', :conditions => 'accepted IS TRUE AND (user = #{self.send(:id)} || friend = #{self.send(:id)})"'

Примечание: мы используем send, поэтому он не оценивает атрибуты, пока не попытается их извлечь.

Если вам действительно нужен синтаксис ".with (user2)", то вы можете сделать это через named_scope, например,

Class Friendship
  named_scope :with, lambda { |user_id|
      { :conditions => { :accepted => true, :friend_id => user_id } }
    }
end

должно позволять:

user1.friendships.with(user2.id)

Примечание: код не проверен - возможно, вам нужно исправить ошибку ...

...