2017-09-07 13 views
1

サブクラスを作成して更新したいが、作成した後でprimary_keyが失われ、更新が不可能になる。Rails ActiveRecordサブクラスが作成後に主キーを失う

マイ(簡体字)の設定は以下の通りです:

Rails 4.2.9 ruby-2.1.10

モデル:

class Contact < ActiveRecord::Base 
    attr_accessible :firstname, 
        :lastname 
end 

class SimpleContact < Contact 
    self.primary_key = 'id' 
end 

contactsテーブル(STI)を共有する両モデル。

コントローラー:

module Public 
    class FilmEntriesController < PublicController 

    # ... 

    def create 
    logger.debug "SIM PK #{SimpleContact.primary_key}" # id 

    contact = SimpleContact.create() 

    logger.debug "SIM PK after create #{SimpleContact.primary_key}" # nil 

    contact.update_attributes({"firstname"=>"Moe", "lastname"=>"Test"}) 
    end 

end 

contacts表は、この移行で作成されました:

class CreateContacts < ActiveRecord::Migration 
    def change 
    create_table :contacts do |t| 
     t.string :firstname # | kontakt_vorname | varchar(64) 
     t.string :lastname  # | kontakt_nachname | varchar(64) 
     t.timestamps 
    end 
    end 
end 

完全なエラーMSGが、その後

ActiveRecord::StatementInvalid in Public::FilmEntriesController#create 
Mysql2::Error: Unknown column 'contacts.' in 'where clause': UPDATE 
`contacts` SET `firstname` = 'Moe', `lastname` = 'Test', `updated_at` 
= '2017-09-07 11:09:39' WHERE `contacts`.`` = 21964 

ある任意のヒントをありがとう!

+0

「contacts」のデータベース移行を表示してください。 – mudasobwa

+0

'primary_key'を' 'id" 'に設定するのはなぜですか?デフォルト値ではありませんか? – Stefan

+0

@mudasobwa:私は質問への移行を追加しました –

答えて

0

SimpleContactモデルを設定してIDを生成しないため、問題が発生していると思います。

self.primary_key = 'id' 

をし、どれもIDが生成されているので:あなたはSimpleContactでのコード行を使用しているので、私はそれを控除しています。

SimpleContactテーブルの移行ファイルが設定されているかどうかを確認できます。

それが本当であれば、それを解決する一つの方法は、あなたのSimpleContactモデル内のコード行を使用することができます。GENERATOR_ID方法は、あなたがしたいIDのいずれかの値であることができ

before_create { self.id = generator_id() } 

。そうすれば、あなたの現在のコードがうまくいくでしょう。

解決する別の方法は、IDを単独で生成するSimpleContactテーブルを設定することです。あなたはそれがどのように行われているかを見るためにgoogleすることができます。

幸運を祈る!

+0

ありがとうございました! SimpleContactは 'contacts'テーブル(私の質問を明確にしました!)を使用しています。テーブルには' id'フィールドがあります。 問題は、作成後、作成されたオブジェクトにidが設定されていないことです。 –

1

STIを使用するには、データベース内のそれぞれの表にtype列が必要です。ちょうどあなたの移行に追加します。

t.string "type", default: "Contact", null: false 

し、モデルから

self.primary_key = 'id' 

を削除します。

+0

あなたの答えをありがとう、おそらく私はSTIが間違っているが、私は型指定が必要ない。 SimpleContactが連絡先に書き込みを行っていれば十分です。これがRails/ARの問題かもしれないと思いますか? –

+2

"タイプ指定は必要ありません" - そうではありませんが、Rails **は**行うには、どのクラスをインスタンス化するかを知る必要があります。 – mudasobwa

+0

"あなたはしませんが、Railsは" - <3 –

関連する問題