Legacy Schemas上的Datamapper [ruby]

时间:2013-10-29 00:57:37

标签: ruby-on-rails sinatra datamapper padrino ruby-datamapper

我正在使用遗留架构,该架构有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中的行的子集

1 个答案:

答案 0 :(得分: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 pm)我找到的另一个替代方法是使用直接数据库查询而不是DataMapper.repository(:onemonth){},这会产生结构对象:

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

我个人觉得第一种方式更清洁。

如果我能做得更好,请告诉我!