使用has_many:through进行rails模型分配

时间:2013-02-02 20:39:28

标签: ruby-on-rails rails-activerecord

我无法弄清楚如何使用连接表创建关系。我已经阅读了关于它们的所有帖子,但主要的错误似乎是在模型的连接表中应该是单数,我有。我似乎可以正确地创建模型并分配它们。我有数据集的项目,项目可以有多个数据集,而数据集可以属于多个项目。数据集可以是活动的,也可以不是,这就是我需要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

有人能指出我正确的方向吗?

感谢您的关注。

1 个答案:

答案 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。