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 分更新) 私が見つけたもう 1 つの方法は、オブジェクトを構造化する 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 に答える