我正在使用遗留架构,该架构有3个支持单个类的特定表,如下所示:
table_1_month
table_1_year
table
所有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
中的行的子集
答案 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}")
我个人觉得第一种方式更清洁。
如果我能做得更好,请告诉我!