2010-06-21 5 views
6

Je souhaite créer un modèle 'Relation' qui étend ActiveRecord :: Base, définit son nom de table comme 'questions_tags', et sans clé primaire. Que devrais-je faire?Comment créer un modèle sans clé primaire dans les rails

class Relation < ActiveRecord::Base 
    set_table_name 'questions_tags' # set table name, right? 

    # how to define 'no-pk'? 

end 

MISE À JOUR


Salut, les gars. Je sais que l'utilisation de 'create_table' peut résoudre ce problème, mais c'est juste ce que je veux savoir: Quelle est la magie derrière create_table(:id=>false)? Comment puis-je obtenir le même effet sans utiliser create_table(:id=>false)?

+1

Selon moi, il n'y a pas de magie. 'create_table' a une option supplémentaire, que la colonne' id' soit créée ou non. C'est tout. Quand vous demandez "la magie": voulez-vous dire le code, l'instruction sql générée, ou autre chose ...? – nathanvda

+1

Si vous voulez savoir ce qui se passe dans les coulisses, je suggère de creuser depper dans l'API Rails Documentation: http://api.rubyonrails.org/classes/ActiveRecord/Base.html, http: // api .rubyonrails.org/classes/ActiveRecord/Migration.html, http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html – auralbee

+0

@ nathanvda, auralbee: merci à vous deux. Je suis nouveau sur les rails, peut-être que j'ai besoin de lire plus d'articles sur l'ActiveRecord. – Freewind

Répondre

8

Créer une migration qui ressemble à ceci:

class CreateQuestionsTags < ActiveRecord::Migration 

    def self.up 
    create_table :questions_tags, {:id => false, :force => true} do |t| 
    ... 
    t.timestamps 
    end 
    end 

    def self.down 
    drop_table :questions_tags 
    end 

end 
+0

merci pour votre réponse. S'il vous plaît voir ma question mise à jour – Freewind

1

Si vous cherchez à créer un tableau croisé dynamique, tel qu'il apparaît à partir du nom de la table, AR le traitera en arrière-plan.

Cependant, si vous cherchez à créer une table avec plus feilds puis: 1) renommer votre table pour « realtions » s'il vous plaît 2) utilisent une clé primaire « id »

Il n'y a pas de bonne raison de ne pas utiliser une clé primaire dans une table, et il est très probable que vous pourriez vous retrouver à le regretter plus tard.

+0

merci. S'il vous plaît voir ma question mise à jour, je veux juste savoir ce qui s'est passé derrière. – Freewind

-7

Pourquoi ne voulez-vous pas un PK? Active Record attend un PK, et je ne vois pas quel mal il peut faire.

+0

merci. Parce que c'est une table de jointure, je ne veux pas avoir un PK – Freewind

+3

si vous créez des mappages de bases de données hérités, c'est bien, mais les tables de jointure dans le modèle/design ActiveRecord ont des clés primaires. C'est une convention que vous pouvez suivre pour vous rendre la vie plus facile ou vous battre constamment contre. – nessur

+3

Il y a plusieurs fois où vous ne voudriez pas de clé primaire. Sur les tables de rapports où vous effectuez des tonnes d'insertions et de lectures basées sur des colonnes de clé non principale, vous pouvez avoir besoin d'index aussi réduits que possible. Avoir une colonne de clé primaire que vous n'allez pas utiliser ne fait que ralentir les insertions. – WattsInABox

Questions connexes