2016-04-22 4 views
0

rails 4.で1対1の関連付けに問題があります。コードはメソッドの欠落を返していませんが、ゼロになります。私はclass_names、外部キー、プライマリキーを追加しようとしました。私はこれをすべて間違っていると思います。どんな助けもありがとう。コレクションの代わりにnilを返すRailsの一対一の関係

コード

client_submission_data.rb

class ClientSubmissionData < ActiveRecord::Base 

    belongs_to :client_submissions, class_name: 'ClientSubmission' 
end 

client_submission.rb

class ClientSubmission < ActiveRecord::Base 

    belongs_to :clients 
    has_one :client_submission_data 
    has_attached_file :csv_file 
end 

schema.rb

create_table "client_submission_data", force: :cascade do |t| 
    t.integer "client_submissions_id" 
    t.text  "json" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    end 

create_table "client_submissions", force: :cascade do |t| 
    t.text  "json" 
    t.integer "clients_id" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    t.integer "client_id" 
    t.string "name" 
    t.string "rows" 
    t.string "csv_file_file_name" 
    t.string "csv_file_content_type" 
    t.integer "csv_file_file_size" 
    t.datetime "csv_file_updated_at" 
    end 

コマンド

rails c 
cs = ClientSubmission.new 
cs.client_submission_data 
#=> nil 

csd = ClientSubmissionData.new 
cs.client_submission_data << csd 
NoMethodError: undefined method '<<' for nil:NilClass 

cs.client_submission_data = csd 
ActiveModel::MissingAttributeError: can't write unknown attribute 'client_submission_id` 
+0

私は 'has_one'はコレクションの代わりに1つのオブジェクトしか返さないと思います。なぜなら、空のコレクション配列ではなくなってしまうからです。 –

+0

私は多分それはそれだと思ったが、ClientSubmissionData objをClientSubmissionに適用しようとしたときにNoMethodErrorが返された。私のスキーマがモデルで宣言しているものと一致しないものでなければなりません。 –

+0

それは働いて、ありがとうございました。あなたはどちらも私の質問の一部に答えました。私は答える人を決めることはできません。 –

答えて

1

belongs_toの団体は、単数形の用語を使用しています。

belongs_to :client_submission 

belongs_to :client 

また、別のモデルを参照していないため、クラス名を指定する必要はありません。スキーマには、client_idとclient_idがあります.client_idとclient_submissions_idではなく、client_submission_idである必要があります。両方のbelongs_toステートメントを変更して移行を実行し、それらのフィールドを変更しても問題はありません。

一般に、モデル/ class_nameは単数形であり、表は複数形です。

+0

私のdbスキーマを本当に素早く変更し、その修正があるかどうか確認します。ありがとうございました。 –

+1

スキーマを更新するために移行を生成してください。手動で更新しないでください。 – margo

1

nilclient_submission_dataではありません。

は、次のclient_submission_dataが何割り当てる場合:

cs = ClientSubmission.new 
csd = ClientSubmissionData.new 
cs.client_submission_data = csd 
cs.save 

利用=の代わり<<

+0

ありがとう!私をもっと遠くにしてくれた。しかし、今私は別のエラーが発生します。私のスキーマは、単一のclient_submission_idの代わりに複数のclient_submissions_idを持っているようです。これを修正する最善の方法は何ですか?私はこの問題を解決するためにモデルにコードを組み込んでいますか? –

+1

モデルにコードを追加して修正することは可能ですが、私はあなたのデータベースを更新し、レール慣習に従ってそれを修正することを提案します。あなたは後で自分自身に感謝するでしょう。 – Dharam

関連する問題