2016-10-02 60 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一個特定的''用戶'可以有很多'''',但是特定的''''可以有很多'用戶'嗎?這似乎是你想要做的關係並不多。 – LucasP

回答

0

對於原始問題,connection沒有區別兩個用戶,所以我將它建模爲one to many關係並驗證它只有兩個用戶。

A like like two users,the liker(giver of like)and the likee(receiver of the like)。每次創建新的like時,都應檢查likee是否也喜歡likerIf 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

太棒了 - 這太棒了!我添加的一件事是連接關聯的'optional:true',這樣類似的東西可以在不需要設置的情況下保存。 – user3162553