1

我需要连接到旧数据库并从使用实体属性值模型存储联系人信息的表中提取数据子集。该表如下所示:

订阅者字段 ID 数据
1 2 杰克
1 3 麻雀
2 2 丹
2 3 史密斯

wherefieldid是表的外键,该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 作为属性。您也可以按照 AR 的预期重命名它们,这样 #first_name 和 #last_name 就可以工作。只需更改 SELECT 的 AS 子句。

于 2009-09-21T14:59:02.153 回答
0

我不确定这是否与您的问题完全相关,但您可能想看看MagicModel。它可以基于遗留数据库为您生成模型。可能会减少您需要做的工作量。

于 2009-09-22T12:12:39.823 回答