Como posso evitar que Rails de “pluralizar” um nome de coluna?
-
19-09-2019 - |
Pergunta
Eu estou usando de dwilkie estrangeiro plugin para trilhos. Eu tenho uma declaração a criação da tabela que se parece com:
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
No entanto, isso gera o seguinte SQL:
[4;35;1mSQL (2.7ms)[0m [0mCREATE TABLE "agents_games" ("agents_id" integer NOT NULL, "games_id" integer NOT NULL) [0m
Eu quero que as colunas a ser chamado agent_id
e game_id
- não agents_id
e games_id
. Como posso evitar que Rails de pluralizar as colunas?
Eu tentei o seguinte no meu arquivo enviornment.rb
, o que não ajuda:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable "agent_id", "game_id"
end
Solução 2
encontrou a solução para o meu problema. Eu tinha que declarar chaves estrangeiras separadamente a partir de referências assim:
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
Com isso, eu poderia tirar o material Inflector.
Outras dicas
Em geral, não lute contra as convenções do Active Record, é parte do que faz o trabalho AR tão bem. No entanto, se para este um caso você quiser fazer uma exceção, é fácil o suficiente através de algum código em seu environment.rb, veja http://api.rubyonrails.org/classes/Inflector/Inflections.html para um exemplo.
Eu acho que você vai conseguir o que você quer se você usar o nome do modelo singular na referência, como este:
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
Esta é uma maneira mais clara, refletindo que cada linha de sua tabela de junção terá um agent_id e um game_id, portanto, irá referenciar um agente com um jogo.
A inflexão adicional ou declarações de chave estrangeira não seria necessário neste caso.