3

Rails 3.2.11 MySql2 Gem

こんにちは、誰かが私のfindメソッドが間違ったタイプのactiverecordを返す理由を知っていますか?

モデルは次のとおりです。

class NameList < ActiveRecord::Base
  attr_accessible :name, :selected, :type
  self.table_name='name_lists'
end  

コンソール出力は次のとおりです。

>> k=NameList.find(28)
NameList Load (0.0ms)  SELECT `name_lists`.* FROM `name_lists` WHERE `name_lists`.`id` = 28 LIMIT 1
#<Neighborhood id: 28, name: "Bayview">

>> k.class
Neighborhood(id: integer, city_id: integer, name: string, street_count: integer,  relative_value: float, home_count: integer, min_lot_size: integer, created_at: datetime, updated_at: datetime)

NameList.findを呼び出していますが、返されるのはNeighborhoodオブジェクトです。奇妙なことに、SQLは正しいように見えます-NameListテーブルのクエリです。

Neighborhoodオブジェクトについて特に特別なことは何もありません。そのためのモデルは次のとおりです。

class Neighborhood < ActiveRecord::Base
  belongs_to :city
  has_many :streets
  attr_accessible :name, :relative_value, :street_count
  def self.make(name, relative_value, min_lot_size, street_count, home_count)
     n=Neighborhood.new
     n.name = name
   end
 end

ただし、保存しようとすると、Neighborhoodのスキーマの定義が使用され、間違ったテーブルが更新されます。

> k.name = "Foo"
"Foo"

>> k.save
(1.0ms)  BEGIN
(0.0ms)  UPDATE `neighborhoods` SET `name` = 'Foo', `updated_at` = '2013-03-14 17:40:46' WHERE `neighborhoods`.`id` = 28
(0.0ms)  COMMIT
 true

何か案は?

4

2 に答える 2

6

Railsの単一テーブル継承(STI)に遭遇しました。これは、テーブルに「タイプ」列を追加するとすぐに取得されます。基本的に、オブジェクトは、その名前がそのレコードのtype列の値と一致するクラスからインスタンス化されます。

STIについて知りたい場合は、ここを読んで、単一テーブル継承のセクションを探してください。あなたの場合、あなたは本当にその振る舞いを望まないに違いないので、あなたの解決策は、列の名前を種類、カテゴリ、またはあなたにとって意味のあるものに変更することです

于 2013-03-14T18:01:49.253 に答える
0

ただし、列名typeが必要な場合は、モデルごとに単一テーブル継承をオフにすることができます。この投稿で私の答えを参照してください

于 2013-12-19T15:08:15.820 に答える