Come posso evitare Rails da “pluralizzare” un nome di colonna?
-
19-09-2019 - |
Domanda
straniero plug-in di dwilkie per le rotaie. Ho una dichiarazione di creazione tabella che assomiglia a:
create_table "agents_games", :force => true, :id => false do |t|
t.references :agents, :column => :agent_id, :foreign_key => true, :null => false
t.references :games, :column => :game_id, :foreign_key => true, :null => false
end
Tuttavia, questo genera il seguente SQL:
[4;35;1mSQL (2.7ms)[0m [0mCREATE TABLE "agents_games" ("agents_id" integer NOT NULL, "games_id" integer NOT NULL) [0m
Voglio le colonne per essere chiamati agent_id
e game_id
- non agents_id
e games_id
. Come posso evitare Rails da pluralizzare le colonne?
Ho provato quanto segue nel mio file enviornment.rb
, che non ha aiutato:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable "agent_id", "game_id"
end
Soluzione 2
Trovato la soluzione al mio problema. Ho dovuto dichiarare chiavi esterne separatamente dai riferimenti in questo modo:
create_table "agents_games", :force => true, :id => false do |t|
t.references :agent
t.foreign_key :agents, :column => :agent_id, :null => false
t.references :game
t.foreign_key :games, :column => :game_id, :null => false
end
Con questo, ho potuto prendere la roba inflettore.
Altri suggerimenti
In generale, non combattere le convenzioni di ActiveRecord, è parte di ciò che rende il lavoro AR così bene. Tuttavia, se per questo un caso si desidera fare un'eccezione, è abbastanza facile con un po 'di codice nel tuo environment.rb, controlla http://api.rubyonrails.org/classes/Inflector/Inflections.html per un esempio.
Credo che si otterrà ciò che si vuole, se si utilizza il nome del modello singolare nel riferimento, in questo modo:
create_table "agents_games", :force => true, :id => false do |t|
t.references :agent, :foreign_key => true, :null => false
t.references :game, :foreign_key => true, :null => false
end
Questo è un modo più chiaro, riflettendo che ciascuna riga della tabella join avrà uno agent_id e uno game_id, così farà riferimento un agente con un gioco.
Il flesso supplementare o stranieri dichiarazioni chiave non sarebbe necessario in questo caso.