【问题标题】:Rails - trouble using has_many relationRails - 使用 has_many 关系的麻烦
【发布时间】:2016-06-15 19:30:27
【问题描述】:

如果这是一个大问题,我深表歉意。我以前擅长滑轨,但已经很长时间了。

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

我有以下表格:

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 是由参数设置的对象

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

UserClassQuestion 表中的列是:

{ user_id: , schoolclass_id: , question_id }

那么,我是不是设置有问题?

【问题讨论】:

  • 你试过has_and_belongs_to_many吗?
  • 你建议在哪里使用它?一个user has_many questions 和一个question belongs_to user。我希望同样的关系适用于SchoolClass 表。看起来关系正常,但数据库命令说它不知道要搜索什么 school_class_id。就像它没有从 @school_class 获取 id 一样
  • 嗯我想写user.rb : has_and_belongs_to_many :schoolclasses, schoolclass.rb: has_and_belongs_to_many :users
  • 但我认为你需要question 模型
  • 在这种情况下,我建议您删除 user_class_question.rb 并将 :through =&gt; :user_class_questions 替换为 :through =&gt; :questions

标签: ruby-on-rails has-many-through has-many


【解决方案1】:

您遇到的错误很可能是由于您的列名称不同。在 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,不需要运行到连接表来执行此操作,因为这会混淆 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

【讨论】:

  • 我刚刚尝试过,但没有任何帮助。我曾考虑过列名并更改了它,但在为数据库播种时会导致问题。如果我理解正确,schoolclass_id 的意思是,表 SchoolClass 索引 = _id 如果我说school_class_id 这意味着不同的表没有?
  • 抱歉之前的belongs_to 关联。我已经编辑以反映最佳方法。不,schoolclass_id 表示 Schoolclass 索引 = _id,而 school_class_id 表示 SchoolClass 索引 = _id
  • 我只是不明白 rails 从哪里得到school_class_id。如果我的所有关系和模型都设置正确,那么@school_class.questions 应该使用user_class_question 表来查找问题,就像它为current_user.questions 所做的那样
  • 我正试图围绕您建立的关联展开思考,但我已经根据我的想法更新了答案
  • 我已经有一段时间没有做一个深入的 Rails 项目了,所以我可能设置错了。我现在实际上是重新开始,如果可能的话,我可能会发布我所有的关联,以便从人们那里得到一点验证,看看我这次是否遗漏了一些重要的东西。 .
【解决方案2】:

您的数据模型需要进行一些更改,您的 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关联,我觉得这是个坏主意,它会创建一个没有主ID的表,然后如果你想用这个连接表做其他事情,那么它会来咬你. has_many, through 是一个额外的步骤,但它是值得的。

【讨论】:

  • 我已经改变了这一点,并拥有与您编写的完全一样的模型。我相信我的问题正如另一个答案所说,与列名有关,它在寻找 school_class_id 而不是 schoolclass_id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多