我遇到与此关联相关的问题。粘贴的代码优于任何标题:
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
你能帮忙吗?
答案 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