2011-07-15 22 views
7

Sono un noob che inizia con ruby ​​su rail e cerca di capire i modelli. Hai familiarità con i database e hai voluto capire quando generare modelli per una relazione?Ruby on Rails - Tabella Modelli e relazioni

Ad esempio, ho tabella utenti tabella e gadget. Ogni utente può avere più gadget. Voglio memorizzare questa relazione in una tabella delle relazioni con user_id e gadget_id. Ho creato le due tabelle utilizzando i binari che generano il modello Utente e le rotaie generano il modello Gadget cmd.

Domanda - Creerò ora un altro modello denominato users_gadgets? La convenzione di denominazione è corretta? Ho visto molta documentazione su come creare associazioni (has_many, belongs_to) ma non capisco quando ho bisogno di creare un modello?

Devo creare modelli ogni volta che voglio memorizzare una relazione in un database e quindi eseguire le mie migrazioni?

risposta

4

si può fare in due modi

1) has_and_belongs_to_many in questo caso è sufficiente una tabella (nessun modello) gadgets_users con gadget_id user_id, rotaie ama i nomi di tabella per essere plurale al fine alpha

2) has_many: attraverso, questo non è un 'normale' ha molti, in questo caso si avrebbe bisogno di un modello (può essere nominato quello che vuoi) preferisco questo uno sopra l'altro perché permette per aggiungere ulteriori attributi alla relazione, se necessario

vedere la guida, lo fa un modo migliore lavoro che spiega quanto possa fare io http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

anche - Railscasts - http://railscasts.com/episodes/47-two-many-to-many

Devo creare modelli ogni volta che voglio conservare un rapporto in un database e quindi eseguire le mie migrazioni? Sì, la maggior parte delle volte

+0

Grazie house9! Per darti un po 'più di contesto, sono abituato a lavorare direttamente in mysql creando le tabelle e poi scrivendo il mio codice. Quindi impostare il modello è un po 'confuso. Per il numero 1, creo la tabella direttamente in mysql? – countdrak

+0

@coutdark Penso che sia meglio usare le migrazioni che possono aiutare a creare tabelle molto facilmente. – PeterWong

1

Trovo che il modo più utile per pensare a questo è pensare ai modelli relativi alla logica della propria applicazione e alle tabelle relative ai dati. Ad esempio, per esempio, il tuo utente ha un nome, un'altezza e un peso. Questi sono attributi dell'utente e memorizzati nella tabella. Sono accessibili attraverso gli attributi del modello. Ma un utente potrebbe anche avere un indice di massa corporea calcolato in base all'altezza e al peso. Questo è un metodo del modello, ma è solo indirettamente correlato al database.

Personalmente, vorrei sempre creare un modello per una tabella di database. È più facile farlo in questo modo, rende più semplice scrivere codice ruby ​​pulito senza molte istruzioni SQL e, se a un certo punto in futuro si desidera aggiungere la logica al modello, è facile farlo.

+0

Grazie questo è molto utile! – countdrak

5

Un modello di relazione ha senso solo per una relazione N-to-N come l'hai descritta. Quando si sceglie di utilizzare has_and_belongs_to_many, non è necessario creare un modello di join, ma è comunque necessario creare la tabella di join tramite una migrazione. La convenzione di denominazione è quindi gadget_users, perché 'g' è prima di 'u' nell'alfabeto.

Se si è scelto has_many: through, è possibile memorizzare ulteriori informazioni all'interno della tabella di join tramite un modello di join GadgetUser. Ad esempio, se si desidera registrare che un gadget appartiene a un utente per un determinato periodo di tempo, le informazioni di questa ora appartengono logicamente alla "connessione" tra il gadget e l'utente, pertanto è necessario conservarlo nella tabella di join.

+0

Grazie questo è molto utile! – countdrak

0

Installare gem install straniero

add seguente riga nel file gioiello

gioiello 'straniero'

dopo tale revisione seguente link

https://github.com/matthuhiggins/foreigner

+0

Se possibile, prova a includere un riepilogo di tutti i collegamenti esterni a cui fai riferimento. Questo è così che se, in futuro, il collegamento muore almeno alcune informazioni utili vengono conservate e non è tutto perso. – niemiro