2011-10-03 2 views
0

나는 부울 값인 is_company에 따라 개인 또는 회사가 될 수있는 User라는 모델을 가지고 있습니다. 사용자가 회사 인 경우 company_name에 이름이 저장됩니다. 사용자가 개인 인 경우 first_namelast_name은 이름을 저장합니다.ActiveRecord에서 SELECT CASE 문을 레일스 모델 default_scope로 사용

대다수의 경우 사용자를 last_name 또는 company_name으로 정렬하도록 기본 설정되어 있으므로 사용자 모델에 default_scope를 사용하고 있습니다.

그러나 SQLLite에서 작동하는 방식으로는 데이터베이스에 무관심하지 않습니다. 아무도 나에게이 사실을 case 문에서 "true"의 매개 변수를 받아들이도록 리펙토링 할 수있는 방법을 알려 주실 수 있습니까?

default_scope select('users.*') 
default_scope select('CASE WHEN is_company = "t" THEN company_name ELSE last_name END AS sort_name') 
default_scope order('sort_name ASC') 

고마워요!

+0

이 두 영역을 분리해야할까요? – Bohdan

답변

1

당신은 데이터베이스에 쓰는 시간이 처리하는 겸손한 재 설계 작업을 수행 할 수 있습니다.

before_save :set_display_name 

def set_display_name 
self.display_name = self.is_company? ? self.company_name : self.last_name 
end 
  • 에 의해 단지 순서로 default_scope 변경

    :

    • 처럼 표시 이름을 설정하여 사용자 모델의 before_save 콜백을 만들기 display_name
    • 에 대한 귀하의 사용자 테이블에 새 열을 만듭니다 새 열

  • +0

    네 - 그게 내가 할거야 - 인생을 훨씬 쉽게 만들어 줄거야! – Daniel

    3

    디자인을 재고해야합니다. 회사가 될 수있는 사용자는 나에게 좋은 디자인처럼 들리지 않습니다. 나는 당신이 UserCompany 모델을 분리하는 것이 더 나을 것이라고 생각합니다.

    귀하의 정렬이 .. 너무 그런 식으로 훨씬 쉽게 될 것입니다

    +0

    위대한 평판 번호를 유감스럽게 생각해서 죄송합니다.) – Bohdan

    +0

    문제가 없지만 1000에 도달하게되어 기쁩니다. – rdvdijk

    +0

    문제는 회사가 할 수있는 모든 것, 사용자가 거의 예외없이 할 수 있다는 것입니다. 유일한 차이점은 성/이름 문제입니다. – Daniel

    관련 문제