2013-08-30 75 views
0

我有兩個表格,userscouplescouples表具有一對外鍵lead_idfollow_id,它們指向users表。我希望User班擁有has_many關聯至Couple,該關聯會選擇給定用戶在其中領先或跟隨的所有對。我能做到這一點使用finder_sql和SQL就像這樣:如何創建兩列的關聯

has_many :couples, class_name: 'Couple', finder_sql: 
    proc { <<-SQL 
     SELECT couples.* FROM users 
     JOIN couples ON (couples.lead_id = users.id 
          OR couples.follow_id = users.id) 
     WHERE users.id = #{self.id} 
    SQL 
    } 

這工作得很好,但:finder_sql顯然是過時了,所以我在尋找另一種方式。我已經使用自定義的關聯範圍這樣得到的最好的:

has_many :couples, -> { 
    joins('JOIN couples ON (couples.lead_id = users.id OR couples.follow_id = users.id)') 
    .select('couples.*') 
}, class_name: 'User', foreign_key: 'id' 

但是,這會導致ActiveRecord的返回User對象,而不是Couple對象。有沒有(不推薦)的方式來做到這一點?

對不起,如果標題不清楚,我願意提供建議。

+0

可能您可以嘗試使用Couple class_name並將其加入到'users'表,而不是使用User class_name加入'couples' –

回答

0

通過文檔展望(http://guides.rubyonrails.org/association_basics.html),你可能能夠擺脫眼前這個:

用戶模式:

has_many: :couples, as: lead 
Has_many: :couples, as: follow 

情侶模式:

belongs_to :users 

而且,看如果你試圖把領導者和追隨者聯繫起來,那麼就是自我加入部分。

希望這會有所幫助。