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
Другие вопросы по тегам