Rails 3:重写Rails约定以适应自定义的FK和PK



我正试图将数据插入表B中,该表使用外键关联引用表a
这是我的密码。

型号.rb

class StudentStatusReport < ActiveRecord::Base
attr_accessible :student_id, :mark
belongs_to :student_details, :class_name => "StudentDetails", :foreign_key => "student_id"
end
class StudentDetails < ActiveRecord::Base
attr_accessible :student_id, :name
has_many :student_status_reports
end  

和Migrations.rb如下

 class CreateStudentDetails < ActiveRecord::Migration
  def change
  create_table :student_details, {:id => false} do |t|
    t.string :student_id
    t.string :name
    t.timestamps
  end
  execute "ALTER TABLE student_details ADD PRIMARY KEY (reg_no);"
 end
end

class CreateStudentStatusReports < ActiveRecord::Migration
  def change
    create_table :student_status_reports do |t|
     t.string  :student_id
     t.integer :mark
     t.timestamps
   end
 end
end    

现在,我使用以下查询将数据插入rails控制台上的StudentStatusReport Model。

e = StudentDetails.find("UG10001")
f = e.student_status_reports.create!(:mark => 40)

但我在控制台上收到以下错误——

ActiveRecord::UnknownAttributeError: unknown attribute: student_details_id  

对此,可能的解决方案是什么
我已经在模型和数据库中定义了外键和主键,我不知道哪里出了问题。Tx。。!

我认为问题出在您的外键上。在StudentStatusReport模型中,您将其定义为student_status_reports表中的student_id列,但在StudentDetails模型中,它(隐式)定义为student_details_id(Rails猜测它是关联名称+_id,除非您明确定义它)。因此,应该通过在parent_mode中指定正确的foreign_key来修复错误:

class StudentStatusReport < ActiveRecord::Base
  attr_accessible :student_id, :mark
  belongs_to :student_details, :class_name => "StudentDetails", :foreign_key => "student_id"
end
class StudentDetails < ActiveRecord::Base
  attr_accessible :student_id, :name
  has_many :student_status_reports, :foreign_key => "student_id"
end

请注意,student_details表中的student_id列实际上并没有在关联中使用,因此您可能会考虑将其删除以使关联更加清晰。

最后,坚持Rails中的默认约定(名为id的整数自动递增主键,单数模型名称)通常是个好主意。但有时你就是不能…:S

相关内容

  • 没有找到相关文章

最新更新