我无法弄清楚如何使用连接表创建关系。我已经阅读了关于它们的所有帖子,但主要的错误似乎是在模型的连接表中应该是单数,我有。我似乎可以正确地创建模型并分配它们。我有数据集的项目,项目可以有多个数据集,而数据集可以属于多个项目。数据集可以是活动的,也可以不是,这就是我需要has_many而不是has_many_and_belongs_to设置的原因。 我的模型定义是:
class Project < ActiveRecord::Base
attr_accessible :name, :user_id
belongs_to :user
has_many :activedatasets
has_many :datasets, :through => :activedatasets
end
class DataSet < ActiveRecord::Base
attr_accessible :name, :project_id, :filename, :tempfilename
has_many :activedatasets
has_many :projects, :through => :activedatasets
end
class ActiveDataSet < ActiveRecord::Base
attr_accessible :active, :data_set_id, :project_id
belongs_to :project
belongs_to :dataset
end
当我创建一个新数据集时,我在params中得到了project_id,所以我试图设置如下所示的关系:
class DataSetsController < ApplicationController
def new
@dataset = DataSet.new
@dataset.activedatasets.project_id = params[:project_id]
end
end
我得到的错误似乎很有名:
NameError in DataSetsController#new
uninitialized constant DataSet::Activedataset
有人能指出我正确的方向吗?
感谢您的关注。
答案 0 :(得分:2)
您需要使用:
has_many :active_data_sets
has_many :data_sets, :through => :active_data_sets
在DataSet模型中:
has_many :active_data_sets
has_many :projects, :through => :active_data_sets
基本上,rails希望您使用下划线来分隔关联名称中的单词,并将它们转换为CamelCase。因此active_data_sets成为ActiveDataSet。然后Rails使用它来确定关联所在的模型类。
您还需要将控制器更改为:
class DataSetsController < ApplicationController
def new
@dataset = DataSet.new
@dataset.active_data_sets.build(:project_id => params[:project_id])
end
end
否则,您将收到错误,因为您尝试设置active_data_sets集合的project_id而不是创建新的ActiveDataSet。