1

レガシーデータベースに接続し、entity-attribute-valueモデルを使用して連絡先の情報を格納するテーブルからデータのサブセットをプルする必要があります。表は次のようになります。

サブスクライバIDフィールドIDデータ
12ジャック
13スズメ
22ダン
23スミス

ここで、は、特定の顧客が持つことができるカスタムフィールド(名、姓、電話など)を一覧表示fieldidするテーブルへの外部キーです。fields関係するSQLは、現在のユーザーに基づくマスター連絡先リストに参加するだけでなく、戻したいすべてのフィールド(現在は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アプリケーションでこれをどのように処理する必要がありますか?これを抽象化して、属性を引き出すために通常の「ドット表記」を使用できるようにしたいと思います。幸いなことに、データは当面の間読み取り専用です。

4

2 に答える 2

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

Contactインスタンスには、属性として#FirstNameと#LastNameがあります。#first_nameと#last_nameが機能するように、ARが期待するように名前を変更することもできます。SELECTのAS句を変更するだけです。

于 2009-09-21T14:59:02.153 に答える
0

それがあなたの質問に完全に密接に関係しているのかどうかはわかりませんが、MagicModelを見てみることをお勧めします。レガシーデータベースに基づいてモデルを生成できます。あなたがする必要がある仕事の量を減らすかもしれません。

于 2009-09-22T12:12:39.823 に答える