【问题标题】:Select associated model with foreign key选择具有外键的关联模型
【发布时间】:2013-11-21 19:08:36
【问题描述】:

我有两个模型

class Endorsement < ActiveRecord::Base
  belongs_to :user, foreign_key: "endorser_id"
  belongs_to :user, foreign_key: "endorsee_id"
end

class User < ActiveRecord::Base
  # Contains a name attribute

  has_many :endorsements, foreign_key: "endorser_id"
  has_many :endorsements, foreign_key: "endorsee_id"
end

我想得到背书人的名字。当我做endorsement.user.name 时,我收到endorsee_id 的名字,而我真的想要endorser_id 的名字。我将如何在 Rails 中执行此操作?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 associations


    【解决方案1】:
    class Endorsement < ActiveRecord::Base
      belongs_to :endorser, class_name: "User", foreign_key: "endorser_id"
      belongs_to :endorsee, class_name: "User", foreign_key: "endorsee_id"
    end
    
    class User < ActiveRecord::Base
      # Contains a name attribute
      has_many :endorsements, foreign_key: "endorser_id"
      has_many :endorsements, foreign_key: "endorsee_id"
    end
    
    endorsement.endorser.name
    

    【讨论】:

    • CDub 的答案更好——用户模型还包含需要更改的重复引用。
    • @AndyV 是的,但是想想当 OP 继续犯下一个错误并发现他可以应用他新发现的知识时所经历的快乐和自我满足!
    【解决方案2】:

    您需要将belongs_tohas_manyname 部分重命名为唯一,然后将class_name: 附加到关系中,以便Rails 知道要查看哪个模型:

    class Endorsement < ActiveRecord::Base
      belongs_to :endorser, foreign_key: "endorser_id", class_name: "User"
      belongs_to :endorsee, foreign_key: "endorsee_id", class_name: "User"
    end
    
    class User < ActiveRecord::Base
      # Contains a name attribute
    
      has_many :has_endorsed, foreign_key: "endorser_id", class_name: "Endorsement"
      has_many :endorsements, foreign_key: "endorsee_id", class_name: "Endorsement"
    end
    

    这将允许您执行以下所有操作:

    User.first.has_endorsed
    User.first.endorsements
    Endorsement.first.endorser
    Endorsement.first.endorsee
    

    【讨论】:

    • 我喜欢在has_many 方法中添加:has_endorsed:endorsements 参数的技巧。但是class_name不应该在用户模型中引用Endorsement而不是User吗?
    【解决方案3】:

    这是因为您正在覆盖关系。您将需要使用class_name 参数。像这样的。

    belongs_to :endorser, class_name: 'User', foreign_key: 'endorser_id'
    belongs_to :endorsee, class_name: 'User', foreign_key: 'endorsee_id'
    

    用户模型也是如此。

    has_many :endorsers, class_name: 'Endorsement', foreign_key: 'endorser_id'
    has_many :endorsees, class_name: 'Endorsement', foreign_key: 'endorsee_id'
    

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2017-05-14
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多