1

레거시 데이터베이스에 연결하고 엔티티 속성 값 모델을 사용하여 연락처의 정보를 저장하는 테이블에서 데이터의 하위 집합을 가져와야합니다. 표는 다음과 같습니다 :RoR을 E-A-V를 사용하는 레거시 테이블과 함께 사용

fieldid 정의를 나열하는 fields 테이블에 대한 외래 키가
 
subscriberid  fieldid  data 
1    2   Jack 
1    3   Sparrow 
2    2   Dan 
2    3   Smith 

는 특정 고객 (예 : 이름, 성, 전화 번호)를 할 수 있습니다 필드. 필자가 원하는 모든 필드 (현재 6 개의 필드가 필요함)와 현재 사용자를 기반으로하는 마스터 연락처 목록에 테이블 자체에 조인해야하기 때문에 관련된 SQL이 다소 모호합니다.

select t0.data as FirstName, t1.data as LastName, t2.data as SmsOnly 
    from subscribers_data t0 inner join subscribers_data t1 
    on t0.subscriberid = t1.subscriberid 
    inner join subscribers_data t2 
    on t2.subscriberid = t1.subscriberid 
    inner join list_subscribers ls 
    on (t0.subscriberid = ls.subscriberid and t1.subscriberid = ls.subscriberid) 
    inner join lists l 
    on ls.listid = l.listid 
    where l.name = 'My Contacts' 
    and t0.fieldid = 2 
    and t1.fieldid = 3; 

가 어떻게 내 RoR에의 응용 프로그램이 처리에 대한 이동해야합니다

는 SQL은 다음과 같이인가? 나는 이것을 멀리하고 여전히 속성을 꺼내기 위해 정상적인 점 표기법을 사용할 수 있기를 바랍니다. 다행히도 데이터는 당분간은 읽기 전용입니다.

답변

1

#find_by_sql은 정확히 설계된 것입니다. 난 당신이 이런 식으로 뭔가를해야 할 일을 할 #find 구현할 것 :

class Contact < ActiveRecord::Base 
    set_table_table "subscribers_data" 

    def self.find(options={}) 
    find_by_sql <<EOS 
     select t0.data as FirstName, t1.data as LastName, t2.data as SmsOnly 
     from subscribers_data t0 inner join subscribers_data t1 
      on t0.subscriberid = t1.subscriberid 
     inner join subscribers_data t2 
      on t2.subscriberid = t1.subscriberid 
     inner join list_subscribers ls 
      on (t0.subscriberid = ls.subscriberid and t1.subscriberid = ls.subscriberid) 
     inner join lists l 
      on ls.listid = l.listid 
     where l.name = 'My Contacts' 
      and t0.fieldid = 2 
      and t1.fieldid = 3; 
    EOS 
    end 
end 

접촉 인스턴스 속성으로 #FirstName 및 #LastName이있을 것이다. AR이 예상하는대로 이름을 바꿀 수 있으므로 #first_name 및 #last_name이 작동합니다. SELECT의 AS 절을 변경하기 만하면됩니다.

0

질문에 완전히 밀착되지 않을지 모르지만, MagicModel을보고 싶을 수도 있습니다. 레거시 데이터베이스를 기반으로 모델을 생성 할 수 있습니다. 당신이해야 할 일의 양을 줄일 수 있습니다.