我有两个型号。用户和反馈
class User < ActiveRecord::Base
has_one :feedback
attr_accessible :email,user_role,.......
end
class Feedback < ActiveRecord::Base
belongs_to :user
attr_accessible :suggest_status, :support_status, :goal_status, :problem, :suggestions
end
我正在尝试向管理员显示所有反馈。
我的反馈控制器看起来像这样
class FeedbacksController < ApplicationController
def index
@feedbacks = Feedback.all
end
def new
@feedback = Feedback.new
end
def create
@user = current_user
@feedback = Feedback.new(params[:feedback])
@user.feedback = @feedback
if @feedback.save
flash[:notice] = "feedback submitted successfully!"
redirect_to @user
else
flash.now[:warning] = "Error submitting feedback."
render :new
end
end
end
现在我想显示与每个反馈相关联的用户的电子邮件。我能够显示user_id,但我不确定如何显示用户模型的电子邮件。
我的index.html.haml反馈如下所示
= stylesheet_link_tag 'all'
%h1 All Feedbacks
%table#feedbacks
%thead
%tr
%th Feedback Number
%th Goals
%th Suggest
%th Support
%th User ID
%tbody
- @feedbacks.each do |feedback|
%tr
%td= feedback.id
%td= feedback.goal_status
%td= feedback.suggest_status
%td= feedback.support_status
%td= feedback.user_id
答案 0 :(得分:2)
问题在于,在创建反馈时,您需要将用户分配给反馈,因为它是您要保存的反馈。实际上,您以其他方式执行此操作,将反馈分配给用户,但不保存用户。所以不要这样:
@user.feedback = @feedback
这样做:
@feedback.user = @user
您可能还需要考虑在反馈模型上添加验证,以禁止在没有用户的情况下保存反馈,如下所示:
validates_presence_of :user
一旦设置正确,那么您的关联应该正常工作。 belongs_to :user
允许您直接引用关联,如下所示:
%td= feedback.user.email
另外,为了提高效率,您应该在加载反馈时急切加载用户:
@feedbacks = Feedback.includes(:user).all
执行此操作只会执行两个查询 - 一个用于获取所有反馈,另一个用于获取所有用户。如果您不急于加载,那么您将获得大量查询 - 一个用于获取所有反馈,但随后会有更多查询,每个用户一个查询。