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
UserClassQuestion
table中的列是:
{ user_id: , schoolclass_id: , question_id }
那么,我是不是设置有误?
您遇到的错误很可能是由于您的列名不同所致。在 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 :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.questions
和 school_class.questions
也尽量不要使用has_many_and_belongs_to关联,我觉得这是个坏主意,它创建了一个没有primary id的table,以后如果你想用这个做其他事情加入table,然后这会来咬你。 has_many,通过是一个额外的步骤,但它是值得的。
如果这是一个大问题,我深表歉意。我曾经擅长 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
UserClassQuestion
table中的列是:
{ user_id: , schoolclass_id: , question_id }
那么,我是不是设置有误?
您遇到的错误很可能是由于您的列名不同所致。在 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 :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.questions
和 school_class.questions
也尽量不要使用has_many_and_belongs_to关联,我觉得这是个坏主意,它创建了一个没有primary id的table,以后如果你想用这个做其他事情加入table,然后这会来咬你。 has_many,通过是一个额外的步骤,但它是值得的。