Rails 3 ActiveRecord Имя таблицы Проблема - PullRequest
1 голос
/ 13 октября 2011

Я на Windows XP ...
Ruby 1.9.2
Rails 3.0.9
MS SQL Server 2005

Я использую tiny_tds + activerecord-sqlserver-adapter

В моей базе данных есть таблица с именем 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

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] WHERE (id = 3)

PS: У меня есть еще несколько таблиц с именами Adddocs и Eclaims .Нет проблем с запросами к ним.

Полагаю, проблема в том, что T4.select ("title"). Where (["id = 3"]) отображается на ВЫБЕРИТЕ заголовок ОТ [t4s] ГДЕ (id = 3) ( T4 до t4s ).Зачем?Я не знаю

Но когда я отредактировал файл config / initializers / inflections.rb примерно так:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 't4', 't4'
end

Все работает!Но это не подходящее решение (плохой тон, я думаю): (((

Ответы [ 2 ]

4 голосов
/ 23 июня 2014

По договоренности, если вы создадите модель с именем album, rails создаст таблицу с именем album.

Чтобы переопределить это (что обычно не делается) и использовать настраиваемое имя таблицы, вы можете использовать set_table_name такой метод в вашей модели:

  class Album < ActiveRecord::Base
      self.table_name="album" * define here whatever table name you have
    end
2 голосов
/ 13 октября 2011

Когда вы создаете новую модель, это единственное число объекта, который вы храните, тогда как когда он генерирует таблицу, он использует множественное число, поскольку в таблице хранится множество.Пример ...

Если вы создадите модель с именем user, вы получите app/models/user.rb, но таблица, которую она составляет, будет называться users.

Если вы не наденетене похоже, что у вас есть несколько вариантов ...

  • Вы можете переопределить перегибы, как сделали, но делать это следует только в том случае, если Rails неправильно использует множественное число, скореечем заставить его использовать определенное слово.

  • Вы можете переопределить имя таблицы, используя метод set_table_name в файле модели, предоставив ему параметр того, какое имя таблицы на самом деле является.

  • Вы можете отключить все именованные таблицы с помощью config.active_record.pluralize_table_names = false в своем файле config/application.rb, однако я настоятельно рекомендую вам не делать этого.

В конечном итоге я бы предложил использовать более описательные имена таблиц, которые могут быть множественными по сравнению с теми, которые не могут.T4 как название модели и таблицы не объясняют мне, что хранится внутри, где, как это делает Post.

...