2013-02-02 41 views
0

我只是无法弄清楚如何创建与联接表的关系。我已经阅读了关于它们的所有帖子,但主要的错误似乎是在模型的连接表中应该是单数的,这是我的。我似乎可以正确创建模型并分配它们。我有数据集项目,项目可以有多个数据集,而数据集可以属于多个项目。数据集可以是活动的或不活动的,这就是为什么我需要has_many而不是has_many_and_belongs_to来设置。 我的模型定义是:rails模型赋值has_many:通过

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

尝试'@ dataset.active_data_sets.create(PROJECT_ID:PARAMS [:PROJECT_ID])' – MrYoshiji

+0

尝试重命名你的协会 - '的has_many:active_data_sets'应该映射'ActiveDataSet' VS'Activedataset' – house9

+0

并且还重命名'的has_many: activedatasets'到'has_many:active_data_sets' – MrYoshiji

回答

2

您需要使用:

has_many :active_data_sets 
has_many :data_sets, :through => :active_data_sets 

而在数据集模型:

has_many :active_data_sets 
has_many :projects, :through => :active_data_sets 

基本上,导轨希望你使用下划线来在协会名称分隔单词,并将其转换为驼峰匹配。所以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得到一个错误。

+0

谢谢,这是有效的。但我有点失落。我以为了解这些模型确实在CamelCase中,并且数据库表格中的下划线和复数都是蛇形的。为什么现在必须使用数据库表而不是模型? – Rudi

+0

令人困惑的是,你实际上并没有在这里使用表名,你正在命名关系。 Rails从这里推断出模型名称,然后从这里推导出表名。在这个例子中,关系和表名是相同的。尽管如此,这一直是一个关系,情况并非如此。关系名称应该是active_data_set,模型ActiveDataSet和表active_data_sets(复数)。 –

相关问题