2012-10-12 3 views
2

레일과 그 관계 쿼리 빌더에 대한 질문이 있습니다. 특히 관련 호출에 대해 어떻게 낙타 사례가 변환되는지에 대한 질문이 있습니다. 게터와 세터가 잘 작동ActiveRecord가 관계 CamelCase를 처리하는 방법

class CustomerPlan < ActiveRecord::Base 
    attr_accessible :customer_id, :plan_id, :startDate, :user_id 

    has_many :planActions 
end 

class PlanAction < ActiveRecord::Base 
    attr_accessible :actionType_id, :customerPlan_id, :notes, :timeSpent 

    belongs_to :customerPlan 
    belongs_to :actionType 
end 

관련 코드와 같은 plan_action.actionType.name 올바르게 관련 모델에서 가져옵니다. 열이 customerPlan_id으로 데이터베이스에 정의되어

SQLite3::SQLException: no such column: plan_actions.customer_plan_id: 
    SELECT "plan_actions".* 
    FROM "plan_actions" 
    WHERE "plan_actions"."customer_plan_id" = 1 

는이를 사용하는 난 그냥 잘못 그러나 customer_plan.planActions.each 오류를 반환? 다른 모든 호출에 대해 작동하며 다른 모든 관계가 정상적으로 작동합니다. 심지어 PlanAction -> CustomerPlan.

내가 모두 the docs을 조사하고 내가 아는 다른 모든 출처를 수색했다. 내 열을 변경하는 것은 간단 할 것입니다. 여기서 일어나는 일을 알고 싶습니다.

감사합니다.


빠른 수정은 foreign_key를 명시 적으로 설정하는 것입니다.

has_many :planActions, :foreign_key => "customerPlan_id", :class_name => "PlanAction" 

그래도 어딘가에 모델 명명 규칙이 누락 된 것 같습니다. 무엇을 알아낼 수없는 것 같습니다.

답변

1

DB 열 이름에 대한 레일스 규칙은 단어가 밑줄로 분리 된 소문자를 사용하는 것입니다 (예 : author_id, comments_count, updated_at 등).

레일 규칙을 따르는 것이 좋습니다. 이것은 당신의 삶을 훨씬 쉽게 만들어 줄 것입니다. 레일 규칙으로 변경하려면 단순히 열을 적절한 스타일로 바꾸려면 마이그레이션을 만드십시오.

class CustomerPlan < ActiveRecord::Base 
    has_many :plan_actions, :foreign_key => 'customerPlan_id' 
end 

당신은 또한 alias_attribute을 사용할 수 있습니다 : 당신이 열 이름에 대한 사용자 지정 스타일을 사용하려는 경우

그러나, 레일 예상 해외 열 이름을 지정하는 has_many 관계에서 :foreign_key 옵션을 제공합니다 매크로를 사용하여 실제 DB 열 이름과 다른 모델 속성 이름을 사용하려면 열 이름의 별명을 지정하십시오. 그러나 내가 언급했듯이 가능한 한 레일 협약에 충실하는 것이 좋습니다. 나중에 고마워 할거야.

+0

정확히 내가 찾던 설명. 시간을내어 도와 주셔서 감사합니다! –

0

레일즈에는 3 가지 기본 명명 스키마가 있습니다.

하나는 상수이고 하나는 ALL_UPPERCASE_SEPARATED_BY_UNDERSCORES입니다.

하나는 클래스 용이고 AllCamelCaseWithNoUnderscores입니다.

하나는 변수 및 메소드 이름이고, 하나는 all_lowercase_separated_by_underscores입니다.

이 방법은 이유는 일관성을 위해서뿐만 아니라 these methods을 사용하여 자유롭게 변환하기 때문입니다.

그래서, 당신의 게시 된 코드 더 레일-Y로 만들려면 :

class CustomerPlan < ActiveRecord::Base 
    attr_accessible :customer_id, :plan_id, :start_date, :user_id 

    has_many :plan_actions 
end 

class PlanAction < ActiveRecord::Base 
    attr_accessible :action_type_id, :customer_plan_id, :notes, :time_spent 

    belongs_to :customer_plan 
    belongs_to :action_type 
end 
+0

감사합니다. 이것은 매우 유용한 정보입니다. –

+0

반갑습니다. 내가 너라면 받아 들여진 답변에서 대소 문자를 피하려고 정말로 노력할 것이다. –

관련 문제