Как я могу запретить Rails «множественное число» имени столбца?
-
19-09-2019 - |
Вопрос
я пользуюсь dwilkie's иностранец плагин для рельсов.У меня есть оператор создания таблицы, который выглядит так:
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
Однако при этом генерируется следующий SQL:
[4;35;1mSQL (2.7ms)[0m [0mCREATE TABLE "agents_games" ("agents_id" integer NOT NULL, "games_id" integer NOT NULL) [0m
Я хочу, чтобы столбцы назывались agent_id
и game_id
- нет agents_id
и games_id
.Как я могу запретить Rails множественное число столбцов?
Я попробовал следующее в своем enviornment.rb
файл, который не помог:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable "agent_id", "game_id"
end
Решение 2
Нашёл решение своей проблемы.Мне пришлось объявить внешние ключи отдельно от ссылок, например:
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
Благодаря этому я мог бы убрать инфлектор.
Другие советы
В общем, не боритесь с условностями ActiveRecord, это часть того, что заставляет AR работать так хорошо.Однако если для этого один случай вы хотите сделать исключение, это достаточно легко с помощью кода в вашем файле Environment.rb, проверьте http://api.rubyonrails.org/classes/Inflector/Inflections.html для примера.
Я думаю, вы получите то, что хотите, если будете использовать в ссылке имя модели в единственном числе, например:
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
Это более понятный способ, поскольку каждая строка вашей таблицы соединений будет иметь один идентификатор агента и один идентификатор игры, таким образом, будет ссылаться на одного агента с одной игрой.
В этом случае дополнительное перегибы или объявления внешнего ключа не потребуются.