我有一个系统可以让用户或访客撰写评论。如果用户撰写评论,则与其user_id相关联。如果客人撰写评论,则会要求他们提供用户名,该用户名存储在评论数据库中名为“guest”的列中。
我不完全确定如何做到这一点,但我对professor_controller所做的是:
def show
@review = Review.where(professor_id: @professor.id).order("created_at DESC")
@avg_review = @review.average(:hw)
if @review.user_id = !nil
@user = User.where(id: @review.user_id)
else
@user = @review.guest
end
render
end
然而,这会产生错误:
NoMethodError in ProfessorsController#show
undefined method `user_id=' for #<Review::ActiveRecord_Relation:0x007fed19228e28>
我甚至在把if语句放入之前就遇到了这个错误。当我的控制器看起来像我时遇到了同样的问题:
def show
@review = Review.where(professor_id: @professor.id).order("created_at DESC")
@avg_review = @review.average(:hw)
@user = User.where(id: @review.user_id)
end
@review工作正常,@ avg_review也是如此。 Reviews表有一个user_id列,Users表有一个id列。
答案 0 :(得分:2)
您正在获得ActiveRecord::Relation(Review
s的集合),而非单个Review的实例。您需要执行Review.where(professor_id: @professor.id).order("created_at DESC").first
或Review.find_by_user_id(@professor.id)
才能返回单个实例。
也就是说,听起来这种关系并没有正确建模,或者通过其他方式表达你想要做的事情的更好方式。你可以把评论的内容作为一个参数吗?
答案 1 :(得分:0)
您的@review
变量实际上包含ActiveRecord::Relation
个对象,就像在错误消息中明确指出的那样:
NoMethodError in ProfessorsController#show
undefined method `user_id=' for #<Review::ActiveRecord_Relation:0x007fed19228e28>
那是因为where
总是返回一个Relation,即使它只找到一个
记录。