1

我在 Windows XP...
Ruby 1.9.2
Rails 3.0.9
MS SQL Server 2005

我正在使用tiny_tds + activerecord-sqlserver-adapter

在我的数据库中,我有一个名为t4的表。我创建了一个这样的模型:rails generate model 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: Invalid object name 't4s'.: SELECT title FROM [t4s] 哪里(id = 3)

PS: 我还有一些名为AdddocsEclaims的表。对他们的查询没有问题。

我猜这个问题是T4.select("title").where(["id = 3"])映射到SELECT title FROM [t4s] WHERE (id = 3)T4t4s)。为什么?我不知道

但是当我像这样编辑文件config/initializers/inflections.rb时:

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

一切正常!但这不是合适的解决方案(我认为语气不好):(((

4

2 回答 2

4

按照惯例,如果您创建一个名为专辑的模型,rails 将创建一个名为专辑的表。

要覆盖它(通常不会这样做)并使用自定义定义的表名,您可以在模型中使用这样的set_table_name方法:

  class Album < ActiveRecord::Base
      self.table_name="album" * define here whatever table name you have
    end
于 2014-06-23T12:25:19.913 回答
2

当您创建一个新模型时,它是您存储的对象的单数,而当它生成表时,它使用复数,因为表中存储了多个。例子...

如果您创建一个名为 的模型user,您最终会得到app/models/user.rb但它创建的表将被调用users

如果你不喜欢,你有几个选择......

  • 你可以像你所做的那样覆盖屈折变化,但是你应该只在 Rails 弄错复数形式时才这样做,而不是强迫它使用某个词。

  • 您可以使用模型文件中的方法覆盖表名set_table_name,并为其提供表名实际名称的参数。

  • config.active_record.pluralize_table_names = false您可以在文件中禁用整个复数表名config/application.rb,但我强烈建议您不要这样做。

最终,我建议使用更具描述性的表名,这些表名可以复数而不是不能的表名。T4作为模型和表名,不要向我解释其中存储了什么,在哪里Post

于 2011-10-13T15:17:01.420 回答