如何使用联接 table 在 Rails 中创建 has_many 和 belong_to 一个关联?
How to create has_many and belong_to one associations in Rails using a join table?
我有以下模型:List
具有(名称和 user_id 字段)和 User
。
每个列表都有很多用户。每个列表都属于一个用户。
我创建了 client_lists
table:
class CreateClientListsTable < ActiveRecord::Migration
def change
create_table :client_lists do |t|
t.integer :user_id
t.integer :list_id
end
add_index :client_lists, :user_id
add_index :client_lists, :list_id
end
end
现在对于第一个关系,很容易说一个列表属于一个用户并且一个用户有很多列表:
class List < ActiveRecord::Base
belongs_to :user
validates :user, :presence => true
end
和
class User < ActiveRecord::Base
has_many :lists, :dependent => :destroy
end
无论如何,我应该如何通过 client_lists table 找到客户列表?
我为列表添加了 HABTM 关系
class List < ActiveRecord::Base
has_and_belongs_to_many :clients, :join_table => "client_lists", :foreign_key => "user_id"
end
然后尝试 List.first.clients
并得到以下错误:
NameError: uninitialized constant List::Client
我必须创建 ClientLists
模型:
class ClientLists < ActiveRecord::Base
belongs_to :user
belongs_to :list
end
然后将以下内容添加到列表模型中:
has_many :client_lists, :class_name => "ClientLists", :foreign_key => "list_id"
has_many :clients, through: :client_lists, source: :user
我有以下模型:List
具有(名称和 user_id 字段)和 User
。
每个列表都有很多用户。每个列表都属于一个用户。
我创建了 client_lists
table:
class CreateClientListsTable < ActiveRecord::Migration
def change
create_table :client_lists do |t|
t.integer :user_id
t.integer :list_id
end
add_index :client_lists, :user_id
add_index :client_lists, :list_id
end
end
现在对于第一个关系,很容易说一个列表属于一个用户并且一个用户有很多列表:
class List < ActiveRecord::Base
belongs_to :user
validates :user, :presence => true
end
和
class User < ActiveRecord::Base
has_many :lists, :dependent => :destroy
end
无论如何,我应该如何通过 client_lists table 找到客户列表?
我为列表添加了 HABTM 关系
class List < ActiveRecord::Base
has_and_belongs_to_many :clients, :join_table => "client_lists", :foreign_key => "user_id"
end
然后尝试 List.first.clients
并得到以下错误:
NameError: uninitialized constant List::Client
我必须创建 ClientLists
模型:
class ClientLists < ActiveRecord::Base
belongs_to :user
belongs_to :list
end
然后将以下内容添加到列表模型中:
has_many :client_lists, :class_name => "ClientLists", :foreign_key => "list_id"
has_many :clients, through: :client_lists, source: :user