Rails 3 ActiveRecord Имя таблицы Проблема
Я на Windows XP...
Ruby 1.9.2
Rails 3.0.9
MS SQL Server 2005
Я использую tiny_tds + activerecord-sqlserver-адаптер
В моей базе данных есть таблица с именем t4. Я создал такую модель: рельсы генерируют модель t4. Вот моя простая модель t4.rb:
class T4 < ActiveRecord::Base
end
Вот файл миграции 20111013125957_create_t4s.rb:
class CreateT4s < ActiveRecord::Migration
def self.up
create_table :t4s do |t|
t.timestamps
end
end
def self.down
drop_table :t4s
end
конец
У меня есть schema.rb:
...
create_table "t4", :force => true do |t|
t.string "title", :limit => 50
end
...
Проблема: Когда я пытаюсь использовать T4.select("title"). Where(["id = 3"]), я получаю сообщение об ошибке: ActiveRecord::StatementInvalid: TinyTds::Error: Неверное имя объекта 't4s'.: SELECT title FROM [t4s] ГДЕ (id = 3)
PS: у меня есть еще несколько таблиц с именами Adddocs и Eclaims. Проблем с запросами к ним нет.
Я предполагаю, что проблема заключается в том, что T4.select("title"). Where(["id = 3"]) отображается в SELECT title FROM [t4s] WHERE (id = 3) (отT4 до t4s). Зачем? Я не знаю
Но когда я редактировал файл config/initializers/inflections.rb примерно так:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 't4', 't4'
end
Все работает! Но это не подходящее решение (плохой тон, я думаю):(((
2 ответа
Когда вы создаете новую модель, это единственное число объекта, который вы храните, тогда как когда он генерирует таблицу, он использует множественное число, поскольку в таблице хранится множество. Пример...
Если вы создаете модель с именем user
, вы в конечном итоге app/models/user.rb
но таблица, которую он делает, будет называться users
,
Если вам это не нравится, у вас есть несколько вариантов...
Вы можете переопределить перегибы, как вы это сделали, однако делать это следует только в том случае, если Rails неправильно использует множественное число, вместо того, чтобы заставлять его использовать определенное слово.
Вы можете переопределить имя таблицы, используя
set_table_name
метод в файле модели, предоставляя ему параметр того, что на самом деле является именем вашей таблицы.Вы можете отключить целые имена таблиц с помощью
config.active_record.pluralize_table_names = false
в вашемconfig/application.rb
файл, однако я настоятельно рекомендую вам не делать этого.
В конечном итоге я бы предложил использовать более описательные имена таблиц, которые могут быть множественными по сравнению с теми, которые не могут. T4
как имя модели и таблицы не объясните мне, что хранится внутри, где как Post
делает.
По соглашению, если вы создадите модель с именем album, rails создаст таблицу с именем album.
Чтобы переопределить это (что обычно не делается) и использовать настраиваемое имя таблицы, вы можете использовать метод set_table_name, как этот в вашей модели:
class Album < ActiveRecord::Base
self.table_name="album" * define here whatever table name you have
end