【问题标题】:How to build has_many :through relationship between the same Model (User) in Rails?如何建立has_many:通过Rails中相同模型(用户)之间的关系?
【发布时间】:2014-12-05 21:00:52
【问题描述】:

我想在同一个模型(用户)之间建立多对多关系。

我有用户模型:

class User < ActiveRecord::Base    
  has_many :broker_clients
  has_many :clients, :through => :broker_clients    
end

和BrokerClient:

class BrokerClients < ActiveRecord::Base
  belongs_to :broker, class_name: "User"
  belongs_to :client, class_name: "User"
end

当我使用 Rails 控制台并执行以下操作时:

>> User.first.clients
  User Load (0.7ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
NameError: uninitialized constant User::BrokerClient
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/inheritance.rb:125:in `compute_type'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/reflection.rb:178:in `klass'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/reflection.rb:420:in `block in source_reflection'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/reflection.rb:420:in `collect'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/reflection.rb:420:in `source_reflection'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/reflection.rb:557:in `check_validity!'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/associations/association.rb:26:in `initialize'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/associations/has_many_through_association.rb:9:in `initialize'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/associations.rb:157:in `new'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/associations.rb:157:in `association'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.0.1/lib/active_record/associations/builder/association.rb:70:in `clients'
    from (irb):4
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/railties-4.0.1/lib/rails/commands/console.rb:90:in `start'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/railties-4.0.1/lib/rails/commands/console.rb:9:in `start'
    from /Users/info/.rvm/gems/ruby-2.0.0-p451/gems/railties-4.0.1/lib/rails/commands.rb:62:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'>>

我在这里做错了什么来得到这个错误:

NameError: uninitialized constant User::BrokerClient

【问题讨论】:

  • 看看你的经纪人客户,这没有多大意义。通常是belongs_to :broker, class_name: 'User'belongs_to :client, class_name: 'User'。然后User 将是has_many :clients, through: :broker_clients
  • 嗯,Client 和 Broker 是 User 的子类。我修改了 BrokerClient : class BrokerClients
  • 你的类应该是单数的。 class BrokerClient 如果您的表是 broker_clients。 ActiveRecord 正在根据您的表名寻找合适的类,但它不存在。
  • 更改了类 BrokerClients -> BrokerClient 但仍然收到此错误:NameError: uninitialized constant User::BrokerClient

标签: ruby-on-rails ruby-on-rails-4 many-to-many has-many-through


【解决方案1】:

试试这个:

class User < ActiveRecord::Base    
  has_many :broker_clients, :class_name => "User", :foreign_key => "broker_id"
  has_many :clients, :class_name => "User", :foreign_key => "client_id"

  #Your class definition here...
end

通过以下方式访问客户端和 broker_clients:

   clients =  User.first.clients
   broker_clients = User.first.broker_clients 

【讨论】:

  • has_many clients without :through => :broker_clients ??我将如何与 broker_clients 表关联?
  • 我不想访问broker_clients,我只想通过broker_clients表访问clients。
  • 我的想法是让客户和经纪人客户都在同一张桌子上,没有第二张桌子。它有点使您的表不规范化,但也可能是一个解决方案。
  • 您是对的,感谢您的帮助。但是我如何对 has_many :through 关系做同样的事情。我更喜欢为关系创建一个单独的表,因为我需要它来存储其他数据。
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
相关资源
最近更新 更多