【问题标题】:ActiveRecord::UnknownAttributeError in rails applicationRails 应用程序中的 ActiveRecord::UnknownAttributeError
【发布时间】:2015-06-10 21:38:13
【问题描述】:

我有两个模型,一个如下

class Course < ActiveRecord::Base
  has_many :assignments, class_name: 'Assignment', foreign_key: :assignment_id, dependent: :destroy
  has_many :groups, class_name: 'Group', foreign_key: :group_id, dependent: :destroy
end

还有另一个模型

class Assignment < ActiveRecord::Base
  belongs_to :course, class_name: 'Course', foreign_key: :course_id
  has_many :questions, class_name: 'Question', foreign_key: :question_id, dependent: :destroy
end

这两者具有一对多的关系,即一门课程可以有许多作业,但作业属于一门课程。

在我的assignment/index.html.erb 视图中,我有以下表单

<%= form_tag({controller: "assignments", action: "new"}, method: "get", class: "nifty_form") do %>
    <%= select_tag "course", options_from_collection_for_select(Course.all, :id, :name) %> <br /><br />
    <%= submit_tag("New Assignment") %>
<% end %>

我的 assignments_controller.rb 的新方法

def new
    @course = Course.find(params[:course])
    @assignment = @course.assignments.build
  end

当我提交上述表格时,我在这一行出现错误@assignment = @course.assignments.build

ActiveRecord::UnknownAttributeError in AssignmentsController#new
unknown attribute: assignment_id

assignment_id 和 course_id 不是任何表中的列。如何解决此错误?

我也是 Rails 新手。由于我有一对多的关系,我正在尝试将数据库创建为 @assignment = @course.assignments.build 这是正确的方法吗?我的意思是我必须写@course.assignments.build 还是只写@assignment = Assignment.new 可以吗?另外我用外键写关系的方式是否正确?

【问题讨论】:

  • 因为没有必要在课程模型中添加foreign_key::assignment_id。当您定义 has_many 关系时,它会自动被理解。请确保您的课程表有 assignment_id 作为列。如果可能,请写下所需的迁移。

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord


【解决方案1】:

belongs_to 表必须将外键定义为表中的列。否则,您认为这些记录将如何关联?

所以你的assignments 表应该有一个整数列course_id。通过迁移创建它。

那么你只需要...

class Course < ActiveRecord::Base
  has_many :assignments, dependent: :destroy

还有……

class Assignment < ActiveRecord::Base
  belongs_to :course

这样就可以了……

@assignment = @course.assignments.build

【讨论】:

    【解决方案2】:

    当您遵循约定时,您不必指定 class_nameforeign_key,就像您的情况一样。

    @assignment = @course.assignments.build 是正确的方法,因为您要指定课程和作业之间的关系。您可以这样做:@assignment = Assignment.new(course: @course),但使用第一种方法。

    编辑:我假设您在Course 中有assignment_id 属性:)

    【讨论】:

    • 但我收到此错误未知属性:assignment_id
    • 在课程表和作业表中,我有 4 列 id、name、created_at 和 updated_at
    • 就是这样。您已创建迁移,并将外键 (assignment_id ) 添加到 Course。检查this 以获取参考
    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多