问题
I'm using dwilkie's foreigner plugin for rails. I have a table creation statement that looks like:
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
However, this generates the following SQL:
[4;35;1mSQL (2.7ms)[0m [0mCREATE TABLE "agents_games" ("agents_id" integer NOT NULL, "games_id" integer NOT NULL) [0m
I want the columns to be called agent_id
and game_id
- not agents_id
and games_id
. How can I prevent Rails from pluralizing the columns?
I tried the following in my enviornment.rb
file, which didn't help:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable "agent_id", "game_id"
end
回答1:
In general, do not fight ActiveRecord's conventions, it's part of what makes AR work so well. However, if for this one case you want to make an exception, it's easy enough via some code in your environment.rb, check out http://api.rubyonrails.org/classes/Inflector/Inflections.html for an example.
回答2:
Found the solution to my issue. I had to declare foreign keys separately from references like so:
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
With this, I could take out the Inflector stuff.
回答3:
I think you'll get what you want if you use the singular model name in the reference, like this:
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
This is a clearer way, reflecting that each row of your join table will have one agent_id and one game_id, thus will reference one agent with one game.
The additional inflection or foreign key declarations wouldn't be necessary in this case.
来源:https://stackoverflow.com/questions/2429516/how-can-i-prevent-rails-from-pluralizing-a-column-name