2009-12-05 2 views
0

죄송합니다. 이전에이 질문을 묻는 질문이 나온 경우 검색했지만 알맞은 이름을 찾지 못했습니다.레일스에서 ​​"유형"을 처리하는 올바른 방법은 무엇입니까?

저는 레일 및 개발에 대한 신참입니다. 나는 해킹 프로그래밍을 해왔지만, 내가하고있는 일을 알고 있다고 말하지 않을 것입니다. 필자는 필자의 Rails 모델과 일반적으로 데이터베이스에서 "유형"을 정의하는 방법에 대해 항상 실패했습니다.

예를 들어, "Car"모델이 있고 "Color"속성이 있습니다. 여기서 Color는 RGB 값이나 기타 값이 아닌 알려진 값에서 선택됩니다. 뭔가가 Color에 대한 또 다른 테이블 (및 관련 모델)이 있어야하며 둘 사이에 어떤 종류의 관계가 있어야하지만 어떤 관계가 적절한 지 알려줍니다. 자동차는 그 색깔에 뒤지지 않으며 그 반대도 마찬가지입니다.

물론 정수를 저장하고 코드에서 찾아 볼 수는 있지만 이것은 나에게 잘못되었습니다.

무엇을 놓쳤습니까? :)

답변

0

색상은 복잡한 개체이거나 필요한 항목에 따라 매우 간단한 것일 수 있습니다.

  • 간단한 : 정수는 이후 "a3ab34은"문자열에 저장된 같은 다른 형식 또는 16 진수 값으로 변환.
  • Complex : 색을 특정 인간 제목에 매핑하고 싶습니다.

간단히 말해 자동차에 color이라는 열이있을 뿐이므로 독자가 원하는대로 원하는 형식으로 표시하려면 독자 메소드를 재정의하십시오.

class Car < ActiveRecord::Base 
    def color(format = :integer) 
    case format 
    when :integer: super 
    when :hex: # ... hex conversion code 
    # ... more conditions ... 
    end 
    end 
end 

우리가 복잡한 사건에 대해 말하면, 그것은 다릅니다. 그런 다음 Color라는 별도의 모델을 사용해야합니다. 그런 다음 Car은 상기 한 것과 같습니다. belongs_to :color입니다. 보다 의미 상으로 Car has_one :color라고 말하면 정확할 것입니다. 그렇다면 색 테이블에 car_id을 저장하도록 강요합니다. 우리의 경우 자동차는 color_id을 저장할 것입니다. 따라서 테이블 carscolor_id을 추가하는 마이그레이션을하십시오.

그럼 당신은 예를 들어 id, titlecode을 포함 할 것입니다 그리고 당신은 물건을 뿌리기 레일을 사용하여 자신을 미리 채울해야 할 것이다하는 colors 테이블에 대한 마이그레이션을 만들어야합니다. (http://railscasts.com/episodes/179-seed-data 참조)

+0

setter의 괄호 앞에 메서드 이름에 equals가 추가되어야합니다. –

+0

이것은 getter입니다. 세터는 전혀 다른 사업입니다. :) –

+0

아. 네가 한 짓을 내가 안다. 나는 그 방법이 논쟁을하기 때문에, 그것은 세터라고 생각했다. 거기에 코드가 거의 없습니다. 틈새에 내 마음이 가득 찼다. 나는 getter가 논쟁을해야한다고 생각하지 않습니다. 'Color # to_s','Color # to_hex' 등을 선호합니다.'Color # color'는 나에게 의미가 없습니다. 왜 슈퍼를 부르는거야? 그러면 인터프리터가 상속 체인을 찾게됩니다. 즉, AR :: Base에서 색상 메서드를 찾으십시오. : s –

0

자동차의 색상은 1 색이므로 Car 인스턴스 belongs_toColor입니다. 여전히 숫자로 색상을 저장하고 어딘가에 상수로 정의 된 색상을 갖는 두 번째 아이디어는 아마도 더 현명 할 것입니다 ... 앱 내에서 색상을 추가/제거/편집 할 필요가 없다면 (즉, 살고 있다').

0

은 루비 유형의 내 경험이 오히려 뭔가 이 무엇인지에 대해 생각보다 당신이을 수행 어떤 일에 대해 생각해야한다는 것입니다. 그런 점에서 매우 jQuery입니다. 사용자가 사용하고있는 브라우저가 무엇인지 물어 보지 마십시오. 브라우저에서 필요한 특정 작업을 수행 할 수 있는지 여부도 묻지 마십시오.

나는 그것이 당신의 질문의 정면이 아니라는 것을 알고있다. 그러나 그것은 루비를 배우고 오리 타이핑을 다루는 자신의 경험과 제목을 고려한 적절한 비유로 보였다.

답을 드리 자면, 고객이 정의 할 수있는 것이라면 색상과 같은 새 개체를 실제로 정의하고 싶을 것입니다. 자동차의 경우 이것은 완전히 유효 할 수 있습니다. 많은 자동차는 특정 색상을 가지고 있으며 실제로는 특별한 색상을 가지고 있습니다. 그래서 실제로 색상은 has_many cars이고 자동차는 색상에 속합니다.

명명 규칙은 나에게도 약간 이상했다. 내가 방금 배운 방법은 belongs_to가 ID 번호가있는 모델이라는 것입니다. 그 이유가 있지만 매번 논리를 풀어 놓으려는 것보다 그 사실을 암기하는 것이 더 쉽습니다. 그게 바로 당신이 진정으로 지켜야 할 전부이며, 당신은 잘 할 것입니다. :)

0

이 예제에서는 자동차의 색상을 별도 모델에 저장하는 것이 적절하지 않다고 생각합니다. 색상은 자동차의 속성이므로 자동차 테이블의 열이 솔루션입니다. 당신은 유한 목록에 색상의 선택을 제한하고 싶다면이 사용 사례 너무 단순한 경우

, 당신은 검증을

class Car < ActiveRecord::Base 
    validates_inclusion_of :colour, :in => %w(red orange yellow green blue indigo violet) 
end 

을 사용할 수 있습니다, 당신이 ActiveRecord::Aggregations::ClassMethods.composed_of 볼 것을 권장합니다. ActiveRecord 모델이 여기있는 해결책이라고 생각하지 않습니다.

관련 문제