активная запись, где внешний ключ может быть любым из двух столбцов - PullRequest
0 голосов
/ 11 июня 2011

У меня есть модель пользователя.

У меня есть модель друга с колонками invit_id, Inviter_id и статусом. Статус используется в качестве флага, был ли принят запрос о дружбе или нет. Inviter_id - это идентификатор пользователя, который отправляет запрос на добавление в друзья, а Invitee_id - это пользователь, который получает запрос на добавление в друзья.

class User < ActiveRecord::Base
    has_many :friends // now i want to search all the friends with accepted friend request. (sent or received both.)
    has_many :pending_friend_requests,:class_name => "Friend", :foreign_key=>"invitee_id", :conditions => {:status => 0}
end

class Friend < ActiveRecord::Base

end

Вопрос заключается в том, как получить всех друзей с принятыми запросами на добавление в друзья .. отправленных или полученных, поскольку есть два иностранных столбца. invid__id или Inviter_id

Ответы [ 2 ]

0 голосов
/ 11 июня 2011

has_many устанавливает отношения.Используйте scope для условий.

class User < ActiveRecord::Base
    has_many :invitees, :through => :friends
    has_many :friends, :foreign_key=>"inviter_id"

    def accepted_invitees
       invitees.where(:friends => {:accepted => true })
    end
end

class Friend < ActiveRecord::Base
    belongs_to :invitee, :class_name => "User"
    belongs_to :inviter, :class_name => "User"

    # needs accepted column
end

Однако это может сбить с толку из-за способа настройки моделей и столбцов.Если бы я делал это, я бы сделал что-то вроде:

class User < ActiveRecord::Base
    has_many :friends, :through => :friendships
    has_many :friendships

    def accepted_friends
        friends.where(:friendships => {:accepted => true })
    end

end

class Friendships < ActiveRecord::Base
    belongs_to :user # change inviter_id to user_id
    belongs_to :friend, :class_name => "User" # change invitee_id to friend_id

    # needs accepted column
end
0 голосов
/ 11 июня 2011

Если я правильно понял ваш вопрос, эта скринкаст - это то, что вам нужно.

Обновлено

Хотя вы говорите, что нет, я думаю, вам нужносамореферентное отношение «многие ко многим».Вместо того чтобы связывать ожидающие запросы, вы можете создать именованную область.И после этого вы можете получить всех приглашенных вами друзей по User.find(params[:id]).friends.accepted.

Что я не могу понять, так это то, хотите ли вы, чтобы user.friends извлекал как приглашенных мной, так и приглашенных мнойИЛИ только один из них.

Из-за ваших имен (приглашающий и приглашенный), я полагаю, это второй случай.Это покрыто в скринкасте.Это делается путем создания дополнительной перевернутой ассоциации (Райан говорит об этом в конце).

Но если это будет первое, самым простым решением будет сделать две строки для каждого приглашающего.приглашенная пара.Вы можете использовать этот gem для упрощения вещей, но он действует так же, как я сказал.

Если это не поможет, попробуйте задать свой вопрос.

...