2010-06-14 2 views
4

보고서와 차트 사이에 간단한 has_many/belongs_to 관계가 있습니다. 내가 가지고있는 문제는 내 차트 모델이 자식이있는 부모라는 것입니다. belongs_to를 사용하여 Rails 객체 상속

그래서 내 보고서 모델에서 나는
class Report < ActiveRecord::Base 
    has_many :charts 
end 

이 그리고 내 차트 모델은 원형, 선, 바 모든 차트에서 상속 부모입니다. belongs_to : 보고서가 차트 모델 또는 차트 모델의 하위에 속하는 위치를 잘 모르겠습니다. 0x104974b90>

차트 모델 : 나는 개체가 "클래스"# < 클래스에 대한

정의되지 않은 지역 변수 또는 메서드 '보고서'타입이기 때문에 chart.report 액세스를 시도 할 때이 오류가 발생할 수 STI를 사용하므로 차트 테이블의 chart_type 열에서 '성별'이라고 표시됩니다. 무엇이 누락 되었습니까? 유형 성별, 또는 섹스의 객체를 인스턴스화

편집

 Chart 
    /\ 
    Pie Line 
    /\ 
/ \ 
Gender Sex 

내가 (STI를 사용)하고 있습니다. 바라기를 이것은 조금 더 도움이된다. [: 차트]의 PARAMS [성별] 또는 PARAMS [: 섹스]

+0

1. 차트 테이블에 '유형'열이 있습니까? 2. Pie 및 Line 클래스는 Chart에서 상속합니까? ('Pie

+0

1. 예, chart_type은 모델에서 getter로 처리합니다. 2. 예, 파이는 차트를 상속합니다. 3. 성별과 성별은 데이터로 실행되는 자체 계산이 있기 때문에 모델입니다. 각 모델 또는 차트 유형에는 값을 계산하는 방법이 있습니다. 그런 다음 모두 동일한 유형의 차트 (원형)를 표시하므로 super를 표시합니다. – Rabbott

답변

2

문제는 하나의 컨트롤러에서 모든 다른 유형의 모델을 수신하는 것입니다. Rails 폼 헬퍼를 사용할 때, 인스턴스로부터 객체 타입을 가져 와서 그것을 사용하여 매개 변수를 채 웁니다. 즉, params[:chart] 대신 params[:gender]이 있음을 의미합니다.

레일스가 양식을 생성하는 데 사용하는 방법을 재정 의하여 수정할 수 있습니다.당신의 기지 차트 클래스에 다음 코드를 넣습니다 : 지금

def self.model_name 
    name = "chart" 
    name.instance_eval do 
    def plural; pluralize; end 
    def singular; singularize; end 
    end 
    return name 
end 

, 차트의 아이가 있다는 사실을 숙지 params[:chart]

로 수신 행동으로 전달됩니다 어떤 클래스 I로 개체 이름을 변경 의 내용은에 의존하는 일부 플러그인/보석의 기능을 손상시킬 수 있습니다. 여러 컨트롤러가 있는지 조사해야합니다. 모든 데이터를 수신하려면 ChartsController 대신에 GenderChartsControllerLineChartsController이 있어야합니다. 이 두 가지 이점을 제공합니다

  1. 당신은 개체 이름을 변경할 필요가 없습니다
  2. 당신이 미래에 차트의 특정 유형에 대한 사용자 정의 코드가 필요하면, 당신은 할 조건문을 추가 할 필요가 없습니다 그것은 다른 컨트롤러가 당신을 위해 그것을 분리 한 것처럼 작동합니다.
1

하면 모든 차트 유형을

내가 제출 한 경우 때문에이

@chart.update_attributes(params[:chart]) 

에 의한 느낌이 그 사실 PARAMS 보고서에 속한 경우 부모 모델 (귀하의 경우 추측하고있는 차트 모델)에

 
belongs_to :report 

을 입력하십시오.

+0

동일한 오류가 발생합니다. 보고서 모델에 다른 것이 필요합니까? 다른 무엇인가 has_many : 차트? – Rabbott

+0

Chart.report를 호출하면 (클래스 오류가 발생합니다.), 차트 모델 개체 –

+0

에서만이 메서드를 호출 할 수 있습니다. "chart = Chart.find (: first)"및 "chart.report" –

2

당신은

class Report < ActiveRecord::Base 
    has_many :charts 
end 

class Chart < ActiveRecord::Base 
    belongs_to :report 
end 

을 사용하여 명시 적으로 Base.inheritance_column을 덮어하지 않는 한, 귀하의 chart_type 열 그냥 type로 변경해야

@chart.report 
@pie.report 
@line.report 
@bar.report 
+0

당신의 예제에서 @chart 객체는 Chart의 자식 인 Pie 차트의 인스턴스가 될 것입니다. – Rabbott

+0

'Chart'의 인스턴스로'@ chart'를 사용했습니다. –

+0

오른쪽, 나를 위해 잘 작동합니다. 그것의 성이나 성을 사용하려고 할 때 그것은 문제가됩니다. 어떤 이유로 STI를 사용하면 객체가 "Class"유형으로 나타납니다. – Rabbott

0

전화를 할 수 있어야한다.

명시 적으로 단일 테이블 상속 열의 이름을 chart_type으로 변경 했습니까?

+0

내 차트 모델 "set_inheritance_column : chart_type" – Rabbott

+0

에 다음과 같이 쓰면 덮어 쓰게됩니다. 음 ... – nfm