Как я могу предотвратить Rails от "множественного числа" имени столбца?
Я использую плагин Dwilkie для иностранцев для рельсов. У меня есть оператор создания таблицы, который выглядит следующим образом:
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
3 ответа
Нашел решение моей проблемы. Я должен был объявить внешние ключи отдельно от ссылок следующим образом:
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
С этим я мог бы взять вещи Inflector.
В общем, не боритесь с соглашениями 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
Это более понятный способ, отражающий, что в каждой строке вашей таблицы соединения будет один agent_id и один game_id, поэтому он будет ссылаться на одного агента в одной игре.
В этом случае дополнительные объявления перегиба или внешнего ключа не потребуются.