2013-08-30 41 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 

而且,看如果你试图把领导者和追随者联系起来,那么就是自我加入部分。

希望这会有所帮助。