如果这是个大问题,我道歉。我曾经擅长铁路,但已经很久了。
我正在使用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 }
那么,我有什么设置错了吗?
答案 0 :(得分:0)
您遇到的错误很可能是由于列名称的变化造成的。在Rails中,school_class_id
与schoolclass_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.questions
和school_class.questions
另外尝试不使用has_many_and_belongs_to关联,我觉得这是一个坏主意,它创建一个没有主要ID的表,如果你想用这个连接表做其他事情,那么这将会来咬你。 has_many,通过是一个额外的步骤,但它是值得的。