【问题标题】:Rails - model belongs_to and has_one same classRails - 模型 belongs_to 和 has_one 相同的类
【发布时间】:2016-09-19 05:11:32
【问题描述】:

我有两个模型,用户和请求

根据定义,一个用户可以有多个请求,每个请求都有一个分配的代理(可以是不同的用户)

基数为,

class User < ActiveRecord::Base
   has_many :requests
end

但是请求模型中有一个列 agent_id 必须链接到用户。 那么我该如何设置关系的最佳方式,

1. User has_many requests (with column requests.user_id) 
2. Request has_one user(with column requests.agent_id)

这两个都在请求表上

【问题讨论】:

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


    【解决方案1】:

    这可能就是你要找的。​​p>

    class User < ActiveRecord::Base
       has_many :requests
    end
    
    class Request < ActiveRecord::Base
       belongs_to :user
       belongs_to :agent, class_name: 'User', foreign_key: 'agent_id'
    end
    

    【讨论】:

      【解决方案2】:

      您将使用关联的长格式版本。在源代码中查找它们以查看所有选项,但对于此示例,只需指定一个额外选项,因为其他所有选项都是默认设置。

      对于用户

      has_many :requests, foreign key: :agent_id
      

      请求

      has_one :user, foreign_key: :agent_id

      【讨论】:

      • 您好,感谢您的回答,但这不是我想要的,我编辑了问题以使其更清楚。
      【解决方案3】:

      应该可以的

      class User < ActiveRecord::Base
         has_many :requests
      end
      
      class Request < ActiveRecord::Base
         belongs_to :agent, class_name: 'User'
      end
      

      如果您还想将 User 与 agent_id 链接:

      class User < ActiveRecord::Base
         has_many :requests, foreign_key: 'agent_id'
      end
      

      【讨论】:

        【解决方案4】:

        建立关系的最佳方式是遵循 Rails 命名约定。 将列“agent_id”重命名为“user_id”。

        通过这样做,您可以使用

        class User < ActiveRecord::Base
           has_many :requests
        end
        
        class Request < ActiveRecord::Base
           belongs_to :user
        end
        

        【讨论】:

          猜你喜欢
          • 2023-04-08
          • 2014-10-01
          • 2014-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多