Rails has_and_belongs_to_many与两种类型的用户和一种类型的表的关系

时间:2014-12-17 20:53:54

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

我遇到与此关联相关的问题。粘贴的代码优于任何标题:

table.rb

class Table < ActiveRecord::Base
  has_and_belongs_to_many :clients, class_name: 'User'
  has_and_belongs_to_many :managers, class_name: 'User'
end

user.rb

class User < ActiveRecord::Base
  has_and_belongs_to_many :tables
end

迁移 - 加入表格

class UsersToTable < ActiveRecord::Migration
  def change
    create_table :tables_users, id: false do |t|
      t.references :user, as: :client
      t.references :user, as: :manager
      t.references :table
    end  
  end
end

问题

tab = Table.new
tab.save
tab.clients.create
tab.clients.create
tab.clients.create
tab.managers.create

tab.managers.size # == 4
tab.clients.size # == 4

当我创建关联对象(用户)时,它们都链接到客户端和管理员。 我希望能够单独创建它们 - 在创建客户端时 - 只有客户数量增加,在创建经理时,只有经理人数增加。 换句话说,我想要这个:

tab.managers.size # == 1
tab.clients.size # == 3

你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

has_and_belongs_to_many :stuff, class_name: 'StuffClass'只是DSL for:

has_many "<inferred_join_table_name>"
has_many :stuff, through: "<inferred_join_table_name>"

由于客户和经理都是User的名称,因此推断的连接表得到&#34; TablesUsers&#34;,这是不对的。

尝试为两者指定连接表,并为每个关系使用不同的连接表:

class Table
  has_many :tables_clients
  has_many :clients, through: :tables_clients

  has_many :tables_managers
  has_many :clients, through: :tables_managers
end

class TablesClients
  belongs_to :client, class_name: 'User'
  belongs_to :table
end

create_table :tables_clients, id: false do |t|
  t.references :client, index: true
  t.references :table, index: true
end

# and the same for tables_managers

然后用户以不同的方式属于Table

class User
  has_many :client_tables_users, class_name: 'TablesUsers', foreign_key: :client_id
  has_many :tables_as_client, through: :client_tables_users, source: :table

  has_many :managed_tables_users, class_name: 'TablesUsers', foreign_key: :manager_id
  has_many :managed_tables, through: :managed_tables_users, source: :table
end