2016-10-02 3 views
1

В Rails, как бы связать условно связанные записи с отношением has_many_through? Используя следующий пример документов Rails:Условно-экономия has_many_through Отношения

class Physician < ApplicationRecord 
    has_many :appointments 
    has_many :patients, through: :appointments 
end 

class Appointment < ApplicationRecord 
    belongs_to :physician 
    belongs_to :patient 
end 

class Patient < ApplicationRecord 
    has_many :appointments 
    has_many :physicians, through: :appointments 
end 

Предположим, что я хотел иметь назначение на прием именно двух врачей. То есть не будет записи о назначении, которой назначено менее двух назначенных врачей. Однако, как это назначение назначалось каждому врачу?

Пример

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

Когда пользователь A любит пользователя B. Создается «как». Когда пользователь B любит пользователя A. Создается «как». Также создается «соединение».

Соединение должно быть в состоянии назвать: connection.users

Пользователь должен быть в состоянии назвать: user.likes user.connections

Проблема, которую я имею, как это может таблица отношения знать, когда взаимно?

+0

Можете ли вы поделиться чем-то примером? –

+0

я добавил больше информация. – user3162553

+0

@ user3162553 У конкретного 'пользователя' может быть много' подобных 's, но может ли у какого-то« похожего »быть много« пользователей »? Кажется, что отношения, которые вы пытаетесь сделать, не многим. – LucasP

ответ

0

Для исходного вопроса connection не имеет значения между двумя пользователями, поэтому я бы смоделировал его как отношение one to many и подтвердил, что у него есть только два пользователя.

Как и у двух пользователей, liker (даритель подобного типа) и likee (приемник подобных). Каждый раз, когда вы создаете новый like, вы должны проверить, нравится ли likeeliker. If likee.likes.where(likee: liker)? Если да, то создайте новое соединение с обоими пользователями.

class User < ApplicationRecord 
    has_many :likes 
    has_many :connections 
end 

class Like < ApplicationRecord 
    belongs_to :user, :foreign_key => 'liker_id' 
    belongs_to :user, :foreign_key => 'likee_id' 
end 

class Connection < ApplicationRecord 
    has_many :likes 
    has_many :users, through: likes 
end 

Я хочу добавить, что я не уверен на 100%, так как я в настоящее время изучаю Rails. Но это то, что я придумал и, надеюсь, полезен (и правильно).

+0

Awesome - это здорово! Одна вещь, которую я добавил, была «optional: true» для ассоциации соединений, чтобы подобное могло быть сохранено без необходимости ее установки. – user3162553

Смежные вопросы