【问题标题】:Rails: ActiveRecord::StatementInvalid inRails:ActiveRecord::StatementInvalid in
【发布时间】:2017-05-16 23:23:58
【问题描述】:

我正在尝试在我的控制器中使用它来获取与学生 (has_many :activities) 相关的所有活动 (belongs_to :student):

@activities = Activity.joins(:student).where(student: {student_id: @student.id})

但是我得到这个错误:

SQLite3::SQLException: 没有这样的列:student.student_id: SELECT "activities".* FROM "activities" INNER JOIN "students" ON "学生"."id" = "活动"."student_id" WHERE "学生"."student_id" = ?

【问题讨论】:

  • 堆栈跟踪在这里可能是一个很好的指标,您确定您的架构正确吗?还有,为什么这里需要join,为什么不只是Activity.where(student: @student)

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

你不能这样做有什么原因吗?:

@activities = @student.activities

您的 Student 类应该如下所示:

class Student < ActiveRecord::Base

  has_many :activities

end

如果您希望能够直接从 Activity 班级访问学生的活动,我建议您改用范围。像这样的东西应该可以工作:

class Activity < ActiveRecord::Base

  scope :for_student, ->(student)  { where(student_id: student) }

end

您可以通过几种不同的方式使用范围:

# pass in the student directly
@activities = Activity.for_student(@student) 

# pass in the student id
@activities = Activity.for_student(@student.id)

# pass in many students
@activities = Activity.for_student([@student1, @student2])

【讨论】:

    【解决方案2】:

    尝试删除学生前缀:

    @activities = Activity.joins(:student).where(student: {id: @student.id})
    

    表示在表student 上找不到列student_id

    【讨论】:

      【解决方案3】:
      @activities = Activity.where(student_id: @student.id)
      

       @activities = @student.activities
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        • 2016-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多