1

私はWindowsXPを使用しています...
Ruby1.9.2
Rails 3.0.9
MS SQL Server 2005

tiny_tds+activerecord-sqlserver-adapterを使用しています

私のデータベースには、t4という名前のテーブルがあります。私は次のようなモデルを作成しました:railsはモデル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] WHERE(id = 3)

PS:AdddocsEclaims という名前のテーブルがもう1つあります。それらへのクエリに問題はありません。

問題は、T4.select( "title")。where(["id = 3"])SELECT title FROM [t4s] WHERE(id = 3)T4 to t4s)にマップされることだと思います。なんで?知らない

しかし、ファイルconfig / initializers / inflections.rbを次のように編集すると、次のようになります。

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

すべてが機能します!しかし、それは適切な解決策ではありません(私が思うに悪いトーン):(((

4

2 に答える 2

4

慣例により、album という名前のモデルを作成すると、rails は albums というテーブルを作成します。

これをオーバーライドして (通常は行われません)、カスタム定義のテーブル名を使用するには、モデルで次のように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 に答える