1

STIを使用するアプリケーションには、EntryとSugarの2つのモデルがあります。これらは非常に単純です。

エントリー:

# == Schema Information
#
# Table name: entries
#
#  id         :integer         not null, primary key
#  created_at :datetime        not null
#  updated_at :datetime        not null
#  user_id    :integer
#  type       :string(255)
#

class Entry < ActiveRecord::Base
  # attr_accessible :title, :body
  belongs_to :user
end

砂糖(amount注釈付きgemからのスキーマ情報が不足していることに注意してください):

# == Schema Information
#
# Table name: entries
#
#  id         :integer         not null, primary key
#  created_at :datetime        not null
#  updated_at :datetime        not null
#  user_id    :integer
#  type       :string(255)
#

class Sugar < Entry
  attr_accessible :amount
end

実行してSugarモデルを作成し、rails g model Sugar amount:integerそれをEntryモデルのサブクラスになるように編集しました。生成された移行により、金額列が作成されました。

class CreateSugars < ActiveRecord::Migration
  def change
    create_table :sugars do |t|
      t.integer :amount

      t.timestamps
    end
  end
end

そして、その列は私のデータベースに存在します:

bridges_development=# \d sugars
                                     Table "public.sugars"
   Column   |            Type             |                      Modifiers                      
------------+-----------------------------+-----------------------------------------------------
 id         | integer                     | not null default nextval('sugars_id_seq'::regclass)
 amount     | integer                     | 
 created_at | timestamp without time zone | not null
 updated_at | timestamp without time zone | not null
Indexes:
    "sugars_pkey" PRIMARY KEY, btree (id)

ただし、「amount」属性やメソッドは存在しないようです。次に例を示します。

1.9.2-p290 :002 > s.amount = 2
NoMethodError: undefined method `amount=' for #<Sugar:0xb84041c> (...)

1.9.2-p290 :003 > s = Sugar.new(:amount => 2)
ActiveRecord::UnknownAttributeError: unknown attribute: amount (...)

amount属性と関連するメソッドが利用できないのはなぜですか?

4

2 に答える 2

1

railsにSTIを使わせたentryからsugarに継承させた場合(single table inheritance)

このスキームでは、すべてのクラスが基本クラスのテーブル (エントリ) に格納され、タイプ列にサブクラスの名前が格納されます。それらはすべて同じテーブルを共有するため、同じ属性も共有します。sugars テーブルはまったく使用されません。

これを望まない場合は、エントリを抽象クラスにすることができます

class Entry < ActiveRecord::Base
  self.abstract_class = true
end

この場合、エントリ テーブルはありませんが、砂糖テーブル (およびエントリの他のサブクラスごとに 1 つ) があります。

もう 1 つの方法は、Entry と Sugar が共有するコードをモジュールに入れることです。

于 2012-05-23T20:21:48.533 に答える
0

STI の考え方は、N モデル - 1 テーブルです。実際には、属性がないSugarテーブルにアクセスしています。entriesamount

于 2012-05-23T20:21:16.627 に答える