2011-01-26 4 views
4

내가 모델 house을하고, 몇 가지 상태를 통해이 같은 삶을 감안할 때 : 나는의가, 데이타베이스 및 주문 그들에 의해에서 열 개 주택을 가정 해 봅시다 검색하고 싶을 경우 Dreaming —> Planning —> Building —> Living —> Tearing down레일 : 데이터베이스의 상태에 의한 주문

을 상태 필드는, 나는

그것을 순서대로 상태 으로 검색하기 전에 구성 데이터베이스 및 순서를 모든 주택을 가져올 수 있나요 ... 다음 Dreaming, Living 다음의 Building 상태에서 먼저 주택을 얻을 것 그들? 의미, 먼저 Dreaming 상태의 모든 주택, 다음 Planning 등. 예. 정렬을 비교하기 위해 배열에 순서를 제공합니다.

모든 항목을 가져온 후에 루비에서이 작업을 수행하는 것을 피하고 싶습니다. 또한 상태에 ID를 사용하고 싶지 않습니다.

UPDATE

열거 구현에 최대 읽은 후, 나는 그것을 작동하게 할 수 있다면, 내가 난 후 무엇을 달성하기 위해 state_machine plugin으로 enum column plugin을 결합하려고합니다, 같아요. 누구든지 전에 이와 비슷한 것을했으면 (특히 Rails 3의 조합) 입력에 감사드립니다! 당신이 MySQL을 사용하는 경우

답변

3

여기 레일 SQL 열거 형을 사용하는 방법에 대한 몇 가지 정보입니다 - 그들은 상대적으로 데이터베이스 휴대용이고 당신이 원하는 것을 거의 할 - http://www.snowgiraffe.com/tech/311/enumeration-columns-with-rails/

+0

정말 재미있어 보여요! 고마워. 열거 형에 대한 단서가 없다는 것을 인정해야합니다. 빠른 검색은 다음을 찾았습니다. https://github.com/ikspres/enum_fu -이 라이브러리 중 하나에 대한 경험이 있습니까? 정렬이 실제로 의도대로 작동합니까? – polarblau

+0

필자는 혼합 된 접근 방식으로 enum_column 플러그인을 사용해 보겠습니다. – polarblau

3

는 다음 솔루션은 FIELD에 의해 주문을하는 것입니다 (상태, '꿈', '건축', '생활', ...) :

House.order("FIELD(state, 'Building', 'Dreaming', 'Living', ...)") 
+0

감사합니다! 이 기능을 사용할 수있는 DB 독립적 인 방법은 없습니다. – polarblau

+0

글쎄, 대신 할 수있는 경우/when/else - 그것은 MySQL과 Postrgesql에서 모두 작동합니다. http://stackoverflow.com/questions/1309624/simulating-mysqls-order-by-field-in-postgresql – psyho

2

당신이 원하는 경우 특정 기준 다음에 수집을 주문한 다음 그 기준을 어딘가에 저장해야합니다.

이 당신의 "하지 루비에서"기준에 간다하지만 아마 이런 식으로 뭔가 할 것인지 모르겠어요이 경우

class House < ActiveRecord::Base 
    STATES { 0 => "Dreaming", 
      1 => "Planning", 
      2 => "Building", 
      3 => "Living", 
      4 => "Tearing Down" } 

    validates_inclusion_of :state, :in => STATES.keys 

    def state_name 
    STATES[self.state] 
    end 
end 

@houses = House.order("state") 

는 DB 필드 상태는 문자열 대신 정수입니다 . 데이터베이스 저장과 쿼리에 매우 효과적입니다.

그런 다음보기에서 state_name을 호출하여 모델에 저장된 STATES 해시에서 올바른 이름을 가져옵니다. 해시에서 문자열 대신 레이블을 사용하여 i18n 현지화를 사용하도록 변경할 수도 있습니다.

+0

해답 . 그것은 내가 필드 ID로 의미했던 것입니다. 이 목적을 위해 문자열을 주 이름으로 사용할 수 있기를 바랍니다. – polarblau

+0

문제 없습니다. 나는 물어보고 싶다. 왜 문자열을 사용해야 할까? 동일한 데이터베이스를 사용하는 다른 응용 프로그램이 있습니까? – DanneManne

+0

사실이 필드는 일종의 상태 머신에서 사용하게 될 것이므로 가능한 한 간단하게 코드를 유지하려고합니다. 이 추상 계층을 가짐으로써 분명히이 경우에 도움이 될 것이지만 다른 사람들의 버그에 대한 가능성과 가능성을 소개하는 느낌이 들었습니다. - 어떻게 생각해? – polarblau