Active Record对象

时间:2015-11-11 15:18:55

标签: ruby-on-rails ruby

我在ActiveRecord对象中发现了一个意外的属性,我无法弄清楚它来自何处。请注意最终属性nil => nil

irb(main):001:0> p = ProgExit.new
=> #<ProgExit id: nil, Student_Bnum: nil, Program_ProgCode: nil, ExitCode_ExitCode: nil, ExitTerm: nil, ExitDate: nil, GPA: nil, GPA_last60: nil, RecommendDate: nil, Details: nil>
irb(main):002:0> p.attributes
=> {"id"=>nil, "Student_Bnum"=>nil, "Program_ProgCode"=>nil, "ExitCode_ExitCode"=>nil, "ExitTerm"=>nil, "ExitDate"=>nil, "GPA"=>nil, "GPA_last60"=>nil, "RecommendDate"=>nil, "Details"=>nil, nil=>nil}

另外两项注意事项:1)此问题不适用于任何其他型号。 2)这个模型在开发,测试和生产方面都是一样的。 3)模型不在任何地方使用attr_accessor。

知道这是从哪里来的吗?我包括相关的模型,虽然它迄今为止很小(仍在研究它)。

class ProgExit < ActiveRecord::Base

    belongs_to :student, foreign_key: "Student_Bnum"
    belongs_to :program, foreign_key: "Program_ProgCode"
    belongs_to :exit_code, foreign_key: "ExitCode_ExitCode"
end

这是我的schema.rb

中的相关代码
  create_table "prog_exits", id: false, force: true do |t|
    t.integer  "id",                           null: false
    t.string   "Student_Bnum",      limit: 9,  null: false
    t.string   "Program_ProgCode",  limit: 45, null: false
    t.string   "ExitCode_ExitCode", limit: 45, null: false
    t.integer  "ExitTerm",                     null: false
    t.datetime "ExitDate"
    t.float    "GPA",               limit: 24
    t.float    "GPA_last60",        limit: 24
    t.datetime "RecommendDate"
    t.text     "Details"
  end

  add_index "prog_exits", ["ExitCode_ExitCode"], name: "fk_Exit_ExitCode1_idx", using: :btree
  add_index "prog_exits", ["Program_ProgCode"], name: "fk_Exit__Program_idx", using: :btree
  add_index "prog_exits", ["Student_Bnum"], name: "fk_Exit_Student1_idx", using: :btree
  add_index "prog_exits", ["id"], name: "id", using: :btree

我不确定此处包含哪些其他代码,但如果还有其他可能是我可以分享的罪魁祸首。

1 个答案:

答案 0 :(得分:1)

由于您已覆盖此表的默认主键(通过在id: false语句中包含create_table选项),因此您需要明确定义此模型的主键。

根据Rails docs,您可以在模型上使用self.primary_key=来明确定义密钥。

请参阅相关问题:ActiveRecord model without primary key