0

我正在使用一个遗留模式,它有 3 个支持单个类的特定表,如下所示:

  • table_1_month
    • # 所有小于 1 个月的物品。
  • table_1_year
    • # 所有 1 个月到 1 岁之间的物品。
  • table
    • # 所有超过 1 年的物品。

所有 3 个表都有相同的模式,但它们之间的唯一区别是上次更新的时间决定了行存在于哪个表中。

我知道 Datamapper 能够通过以下语法指定不同的 storage_names:

class Klass
  storage_name[:default] = "table"
  storage_name[:onemonth] = "table_1_month"
  storage_name[:oneyear] = "table_1_year"
end

我将如何编写一个查询来指定访问文章的存储库?(例如,访问 2 个月前的所有行的查询将需要检索所有行并将其附加table_1_month到 中的行的子集table_1_year

4

1 回答 1

0

我能够得到符合我想要的东西的最简单的方法是添加新的存储库。

Datamapper.setup(:default), <Insert database connection url>
DataMapper.setup(:onemonth), <Insert the same database url>
Datamapper.setup(:oneyear), <Insert the same database url>

在模型类中,

class Klass
  storage_name[:default] = "table"
  storage_name[:onemonth] = "table_1_month"
  storage_name[:oneyear] = "table_1_year"

  # Psuedocode
  def get_from_timeperiod(start_time, end_time)
    time_one_year_ago = <some other int>
    time_one_month_ago = <some int>
    if end_time < time_one_month_ago
      DataMapper.repository(:onemonth) { self.all( self.updated => (start_time..end_time) ) }
    elif end_time < time_one_year_ago
      DataMapper.repository(:oneyear) { self.all( self.updated => (start_time..end_time) ) }
    else
      self.all( self.updated => (start_time..end_time) )
    end
  end
end

(更新 10/31 下午 6:13)我发现的另一种选择是使用直接数据库查询而不是 DataMapper.repository(:onemonth) { } ,这会导致结构对象:

 repository(:default).adapter.select("SELECT * FROM table_one_month WHERE updated between #{start_time} and #{end_time}")

我个人觉得第一种方法更干净。

请让我知道是否有更好的办法!

于 2013-11-01T00:27:13.467 回答