Вопрос

Как я бы напишет этот запрос, используя Metawhere (в рельсах 3)?

SELECT "users".* FROM "users" 
INNER JOIN "friendships" friends 
   ON "users"."id" = friends."friend_id" 
INNER JOIN "friendships" inverse_friends 
   ON "users"."id" = inverse_friends."user_id" 
WHERE friends."user_id" = 4 
   AND friends."status" = 't' 
   AND inverse_friends."friend_id" = 4 
   AND inverse_friends."status" = 't'

Я пытаюсь добавить метод на свойUser класс называется buddies это вернет оба friends а также inverse_friends из этого Railscast по самореференциальной ассоциации.

Я бы признателен за любую помощь!


РЕДАКТИРОВАТЬ: Я хочу иметь возможность запрашивать возвращенный набор, так что я могу сделать:

def is_a_buddy_of?(user)
  not self.buddies.where(:friend_id >> user.id).empty?
end

Решение: не говоря уже о последнем редактировании, я просто изменил свой is_a_buddy_of?(user) метод этого, используя | оператор на моих существующих ассоциациях:

def is_a_buddy_of?(user)
  status = false
  self.buddies.map do |buddy|
    status = true if buddy.id == user.id
  end
  status
end
Это было полезно?

Решение

Почему бы вам просто не сделать следующее в своей пользовательской модели?:

def buddies
  inverse_friends | friends
end

| это профсоюзный оператор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top