2010-06-21 24 views
6

Voglio creare un modello "Relazione" che estende ActiveRecord :: Base, impostare il nome della tabella come "question_tags" e senza chiave primaria. Cosa dovrei fare?Come creare un modello senza chiave primaria nelle guide

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

    # how to define 'no-pk'? 

end 

UPDATE


Salve, ragazzi. So che usare 'create_table' può risolvere questo problema, ma questo è proprio quello che voglio sapere: qual è la magia dietro create_table(:id=>false)? Come posso ottenere lo stesso effetto senza usare create_table(:id=>false)?

+1

Secondo me non c'è nessuna magia. 'create_table' ha un'opzione extra, indipendentemente dal fatto che la colonna' id' debba essere creata o meno. È tutto. Quando chiedi "la magia": intendi il codice, l'istruzione sql che viene generata, o qualcos'altro ...? – nathanvda

+1

Se vuoi sapere cosa succede dietro le quinte, ti suggerirei di scavare depper nella documentazione dell'API Rails: 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: grazie a entrambi. Sono nuovo alle rotaie, forse ho bisogno di leggere più articoli su ActiveRecord. – Freewind

risposta

8

Creare una migrazione che assomiglia a questo:

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

grazie per la tua risposta. Si prega di vedere la mia domanda aggiornata – Freewind

1

Se stai cercando di creare una tabella pivot, come appare dal nome della tabella, AR lo gestirà in background.

Tuttavia, se stai cercando di creare una tabella con più feilds poi: 1) rinominare la tabella per "realtions" si prega 2) utilizzare una chiave primaria "id"

Non c'è nessuna buona ragione per non usare una chiave primaria in una tabella, ed è molto probabile che potresti ritrovarti a rimpiangerlo in seguito.

+0

grazie. Si prega di vedere la mia domanda aggiornata, voglio solo sapere cosa è successo dietro. – Freewind

-7

Perché non vuoi un PK?

Active Record si aspetta un PK e non vedo che danno può fare.

+0

grazie. Poiché si tratta di una tabella join, non voglio che abbia un PK – Freewind

+3

se stai creando legacy DB mapping, va bene, ma le tabelle join nel pattern/design ActiveRecord hanno chiavi primarie. È una convenzione che puoi seguire per rendervi la vita più facile o per combattere costantemente. – nessur

+3

Ci sono molte volte che non vorresti una chiave primaria. Nelle tabelle di rapporto in cui si eseguono tonnellate di inserimenti e letture basate su colonne non chiave primarie, si consigliano il minor numero possibile di indici. Avere una colonna chiave primaria che non utilizzerai non fa altro che inserimenti lenti. – WattsInABox

Problemi correlati