0

我只是不知道如何创建与连接表的关系。我已经阅读了所有关于它们的帖子,但主要错误似乎是模型的连接表中应该是单数的,我有。我似乎可以正确地创建模型并分配它们。我有带有数据集的项目,项目可以有多个数据集,而一个数据集可以属于多个项目。数据集可以是活动的或不活动的,这就是为什么我需要 has_many through 而不是 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

当我创建一个新数据集时,我在参数中有 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

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

谢谢你的关注。

4

1 回答 1

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。

于 2013-02-02T20:51:25.187 回答