2013-02-02 2 views
0

단지 조인 테이블과 관계를 만드는 방법을 알 수 없습니다. 나는 그들에 대한 모든 게시물을 읽었지만, 주요 오류는 모델에 대한 조인 테이블에서 단수이어야한다는 것으로 보인다. 모델을 올바르게 만들고 할당하는 것처럼 보일 수 있습니다. 데이터 세트가있는 프로젝트가 있고 프로젝트는 여러 개의 데이터 세트를 가질 수 있지만 데이터 세트는 여러 개의 프로젝트에 속할 수 있습니다. 데이터 셋은 활성화되거나 비활성화 될 수 있습니다. 따라서 has_many_and_belongs_to 설정 대신 has_many through가 필요합니다. 내 모델 정의는 다음과 같습니다레일스 모델 할당 with has_many : through

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 

아무도 올바른 방향으로 나를 가리킬 수 있습니까?

감사합니다. 기본적으로

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

은 레일이 연결 이름에 단어를 분리하기 위해 밑줄을 사용할 것으로 예상하고 낙타 표기법으로 변환 :
has_many :active_data_sets 
has_many :data_sets, :through => :active_data_sets 

그리고 데이터 집합 모델

:

+0

은'@의 dataset.active_data_sets.create을 시도' – MrYoshiji

+0

당신의 연결 이름을 변경하려고 -'has_many을 : 그 Activedataset' – house9

+0

'대 ActiveDataSet''에 매핑 또한'has_many의 이름을 변경해야 active_data_sets' : active_data_sets' – MrYoshiji

답변

2

당신은 사용해야합니다. 따라서 active_data_sets는 ActiveDataSet이됩니다. Rails는 이것을 사용하여 연관성이있는 모델 클래스를 찾아 낸다.

당신은이에 컨트롤러를 변경해야합니다 : 당신이 오히려 새로운 ActiveDataSet를 만드는 것보다 active_data_sets 수집의 PROJECT_ID을 설정하려고하기 때문에

class DataSetsController < ApplicationController 
    def new 
    @dataset = DataSet.new 
    @dataset.active_data_sets.build(:project_id => params[:project_id]) 
    end 
end 

은 그렇지 않으면 오류가 발생합니다. (: PARAMS [: PROJECT_ID] PROJECT_ID)

+0

감사합니다. 그러나 나는 조금 잃어 버렸다. 나는 모델이 CamelCase에 실제로 있다는 것을 알았고, 밑줄과 복수형이있는 뱀 케이스의 데이터베이스 테이블을 생각했습니다. 모델 대신 데이터베이스 테이블을 사용해야하는 이유는 무엇입니까? – Rudi

+0

혼란스럽게도 실제로 여기서 테이블 이름을 사용하지 않고 관계 이름을 지정합니다. Rails는 여기에서 모델 이름을 추론 한 다음 테이블 이름을 추측합니다. 이 예제에서 관계와 테이블 이름은 동일합니다. 이것은 has_one 관계 였지만, 그럴 경우는 아닙니다. 관계 이름은 active_data_set, 모델 ActiveDataSet 및 테이블 active_data_sets (복수)이었습니다. –