2009-05-05 7 views
3

J'ai une table avec une ligne et deux columns-Rails ActiveRecord - est-il possible d'effectuer des opérations sur des tables sans identifiant?

int 'version', datetime 'updated' 

Est-il possible Rails ActiveRecord pour obtenir et définir les données dans ces colonnes? Il n'y a pas de colonne id.

J'utilise cette table pour suivre les versions des requêtes d'autres tables. Après chaque requête d'une autre table, la colonne version est incrémentée et la colonne mise à jour est définie avec datetime en cours.

+0

Mon intention est de faire en sorte que cette table fonctionne de la même façon que Rails suit les versions de migration avec la table 'schema_info'. – daustin777

+0

J'ai mis en place un blog sur ce sujet: http://ho.race.hk/blog/?p=208 – ohho

Répondre

4

Rien ne vous empêche de l'utiliser dans ActiveRecord sans ID:

La migration contient:

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

Requêtes:

>> 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">] 

Le rapport du journal ces des requêtes 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) 

J'espère que ça aide

+0

Je ne savais pas que ça fonctionnait comme ça. Truc cool. Bien que, j'imagine une mise à jour ou une suppression ne fonctionnerait pas comme prévu puisque ces opérations dépendent d'une clé primaire existante. –

+0

.all est un alias à .find (: all). L'utilisation de la plupart des autres paramètres pour .find entraînera une erreur en raison de l'absence d'un identifiant. – daustin777

1

La seule chose que Rails fonctionne lorsqu'aucune colonne id n'est présente, est une table de jointure has_and_belongs_to_many.

Sinon, vous devez descendre à SQL pur, avec quelque chose comme:

SomeModel.connection.execute "select * from mytable" 

Ou si version est destiné à être la clé primaire, utilisez la réponse de John.

6

Dans votre classe de modèle, utilisez self.primary_key = "primary_key_column" pour spécifier la colonne à utiliser comme colonne de clé primaire. Je suppose que dans votre cas, vous pouvez utiliser la colonne version.

Questions connexes