Rails - 使用 has_many 关系时遇到问题

Rails - trouble using has_many relation

如果这是一个大问题,我深表歉意。我曾经擅长 rails 但已经很久了。

我正在做一个 rails 项目,但在处理 has_many 关系时遇到了问题。

我有以下 tables:

User
SchoolClass
Question
UserClassQuestion

在我拥有的模型中:

user.rb
   has_many :questions, :through => :user_class_questions
   has_many :user_class_questions

school_class.rb
   has_many :questions, :through => :user_class_questions
   has_many :user_class_questions

question.rb
   belongs_to :schoolclass
   belongs_to :user

user_class_question.rb
   belongs_to :question

所以,我想要的是在用户主页上,显示让他们查看他们用 current_user.questions 提出的问题。这行得通。

但是在 SchoolClass 显示页面上,如果我说 @school_class.questions,我会得到以下错误:

!!<ActiveRecord::StatementInvalid: SQLite3::SQLException: no such colum:
 user_class_questions.school_class_id: SELECT "questions".* FROM "questions" 
INNER JOIN "user_class_questions" ON "questions"."id" = 
"user_class_questions"."question_id" WHERE 
"user_class_questions"."school_class_id" = ?>

@school_class是params设置的对象

def set_school_class
   @school_class = SchoolClass.find(params[:id])
end

UserClassQuestiontable中的列是:

{ user_id: , schoolclass_id: , question_id }

那么,我是不是设置有误?

您遇到的错误很可能是由于您的列名不同所致。在 Rails 中,school_class_idschoolclass_id 不同。我认为一种快速解决方法是在 belongs_to 选项中指定 primary_key/foreign_key

更持久的解决方案是 运行 迁移以将您的列重命名为 school_class_id 而不是 schoolclass_id

如果我能提供帮助,请告诉我。

更新

如果 belongs_to :school_class 是在 question 上定义的,那么您可以访问 question.school_class 并且您的 school_class 模型应该只有 has_many :questions,不需要 运行 连接 table 来做到这一点,因为那样会使 rails 有点混乱。但是,如果您不想这样,您可以注释掉 belongs_to :school_class 关联,而是在 question

上添加 has_many :user_class_questions
class User
   has_many :questions, through: :user_class_questions
   has_many :user_class_questions
end

class SchoolClass
   has_many :questions, through: :user_class_questions
   has_many :user_class_questions
end

class Question
   #belongs_to :school_class
   belongs_to :user
   has_many :user_class_questions
end

class UserClassQuestion
   belongs_to :question
   belongs_to :school_class
   belongs_to :user
end

您的数据模型需要一点改变,您的 UserClassQuestion 是一个连接模型,它应该包含有关用户、学校班级和问题的数据。所以关系应该是这样的

UserClassQuestion rails g model UserClassQuestion user:references school_class:references question:references

class UserClassQuestion < ActiveRecord::Base
  belongs_to :user
  belongs_to :school_class
  belongs_to :question
end

school_class.rb

class SchoolClass < ActiveRecord::Base
  has_many :user_class_questions
  has_many :questions, through: :user_class_questions
end

user.rb

class User < ActiveRecord::Base
  has_many :user_class_questions
  has_many :questions, through: :user_class_questions
end

然后你可以做 user.questionsschool_class.questions

也尽量不要使用has_many_and_belongs_to关联,我觉得这是个坏主意,它创建了一个没有primary id的table,以后如果你想用这个做其他事情加入table,然后这会来咬你。 has_many,通过是一个额外的步骤,但它是值得的。