Rails - 使用has_many关系时遇到麻烦

时间:2016-06-15 19:30:27

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

如果这是个大问题,我道歉。我曾经擅长铁路,但已经很久了。

我正在使用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 }

那么,我有什么设置错了吗?

2 个答案:

答案 0 :(得分:0)

您遇到的错误很可能是由于列名称的变化造成的。在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:问题,无需运行到连接表来执行此操作那会让铁路有点困惑。但是,如果你不想这样,你可以注释掉belongs_to :school_class个人,而has_many :user_class_questions上有一个question

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

答案 1 :(得分:0)

您的数据模型需要进行一些更改,您的UserClassQuestion是一个连接模型,它应该包含有关User,SchoolClass和Question的数据。所以关系应该是

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,通过是一个额外的步骤,但它是值得的。