0

結合テーブルを使用してリレーションを作成する方法がわかりません。それらに関するすべての投稿を読みましたが、主なエラーは、モデルへの結合テーブルで、私が持っている特異なものでなければならないということのようです。モデルを正しく作成して割り当てることができます。データセットを含むプロジェクトがあり、プロジェクトには複数のデータセットを含めることができますが、データセットは複数のプロジェクトに属することができます。データセットはアクティブでも非アクティブでもかまいません。そのため、has_many_and_belongs_toセットアップの代わりに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

誰かが私を正しい方向に向けることができますか?

ご清聴ありがとうございました。

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 は、アンダースコアを使用して関連付け名の単語を区切ることを想定しており、キャメルケースに変換します。したがって、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

そうしないと、新しい ActiveDataSet を作成するのではなく、active_data_sets コレクションの project_id を設定しようとしたため、エラーが発生します。

于 2013-02-02T20:51:25.187 に答える