Rails 中的一对一关系返回 nil 而不是 Collection Proxy

One-to-One Relationship in Rails returning nil instead of Collection Proxy

我在 rails 4 中遇到一对一关联的问题。代码没有返回缺少的方法,但我没有得到。我试过添加 class_names、外键、主键我想我只是做错了。任何帮助将不胜感激。

代码

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`

belongs_to 协会使用单数术语。

belongs_to :client_submission

belongs_to :client

此外,我不确定您是否需要指定 class 名称,因为您指的不是其他型号。在您的架构中,您有 clients_id 和 client_id,它应该是 client_id 和 client_submission_id 而不是 client_submissions_id。如果您同时更改 belongs_to 语句 运行 一些迁移以更改这些字段,您应该没问题。

一般model/class_name是单数,table是复数。

你得到 nil 因为没有 client_submission_data.

如果要分配 client_submission_data,请执行以下操作:

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

使用 = 而不是 <<