2013-10-29 72 views
0

我與它有3分特定的表背的單一類的傳統模式工作,列舉如下:的DataMapper [紅寶石]在傳統架構

  • table_1_month
    • #所有項目是<1個月舊。
  • table_1_year
    • #所有項目是1個月和1歲之間。
  • 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

,我是能夠沿着得到的東西最簡單的方法我想要的是添加新的存儲庫。

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(:1個月){}結果結構對象:

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

我個人發現,第一種方法是更清潔。

請讓我知道,如果有什麼更好的,我可以做!