【问题标题】:How to create an association with from two columns如何从两列创建关联
【发布时间】:2013-08-30 11:14:16
【问题描述】:

我有两张桌子,userscouplescouples 表有一对外键 lead_idfollow_id 指向 users 表。我希望User 类与Couple 有一个has_many 关联,它选择给定用户是领导或关注的所有夫妇。我可以使用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 对象。有没有(不推荐的)方法可以做到这一点?

对不起,如果标题不清楚,我愿意接受建议。

【问题讨论】:

  • 也许您可以尝试使用 Couple class_name 并将其加入 users 表,而不是使用 User class_name 加入 couples

标签: sql ruby-on-rails activerecord


【解决方案1】:

查看文档 (http://guides.rubyonrails.org/association_basics.html),您也许可以逃脱惩罚:

用户模型:

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

情侣款:

belongs_to :users 

此外,如果您试图将领导者和追随者联系起来,请查看自我加入部分。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2020-05-20
    相关资源
    最近更新 更多