2009-05-05 4 views
3

私は1つの行を持つテーブルがあると2 Rails ActiveRecord - IDのないテーブルで操作を実行する方法はありますか?

columns-
int 'version', datetime 'updated' 

は、これらの列のデータを取得し、設定するのRailsのActiveRecordの方法はありますか? ID列はありません。

私は他のテーブルのクエリのバージョンを追跡するためにこのテーブルを使用しています。別のテーブルの各クエリの後、バージョン列がインクリメントされ、更新された列が現在のdatetimeで設定されます。

+0

この表は、Railsが 'schema_info'テーブルを使って移行バージョンを追跡する方法と似ています。 – daustin777

+0

私はこのトピックに関するブログを公開しています:http://ho.race.hk/blog/?p=208 – ohho

答えて

4

何もあなたがIDなしのActiveRecordでそれを使用することを防ぐない

create_table :posts, :id => false do |t| 
    t.integer :version 
    t.datetime :updated 
end 

クエリ:

>> Post.create(:version => 1, :updated => Time.now) 
=> #<Post version: 1, updated: "2009-05-05 19:24:31"> 
>> Post.all 
=> [#<Post version: 1, updated: "2009-05-05 19:24:31">] 
>> Post.all(:conditions => { :version => 1 }) 
=> [#<Post version: 1, updated: "2009-05-05 19:24:31">] 

ログレポートこれらのSQL要求:

CREATE TABLE "posts" ("version" integer, "updated" datetime) ; 
INSERT INTO "posts" ("version", "updated") VALUES(1, '2009-05-05 19:24:31'); 
SELECT * FROM "posts" 
SELECT * FROM "posts" WHERE ("posts"."version" = 1) 

役に立った!

+0

私はそれがそのように働いていたのか分かりませんでした。クール。ただし、これらの操作は既存の主キーに依存するため、更新または削除が期待どおりに機能しないと考えられます。 –

+0

.allは.find(:all)のエイリアスです。 .findに他のほとんどのパラメータを使用すると、idがないためにエラーが発生します。 – daustin777

1

id列が存在しない場合、唯一の作業は、has_and_belongs_to_manyの結合表です。

そうしないようなもので、純粋なSQLをドロップダウンする必要があります。ジョンの答えを使用し、

SomeModel.connection.execute "select * from mytable" 

場合やversionが主キーであることを意図しています。

6

モデルクラスでは、self.primary_key = "primary_key_column"を使用して、主キー列として使用する列を指定します。私はあなたのケースでは、バージョンの列を使用することができると思います。

移行が含まれています: