Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道5-n+;1简单表单gem中的查询问题_Ruby On Rails_Ruby On Rails 5_Simple Form - Fatal编程技术网

Ruby on rails 轨道5-n+;1简单表单gem中的查询问题

Ruby on rails 轨道5-n+;1简单表单gem中的查询问题,ruby-on-rails,ruby-on-rails-5,simple-form,Ruby On Rails,Ruby On Rails 5,Simple Form,我试图用Bullet gem解决Rails中的每一个n+1问题,但我无法解决这个特殊问题: \u form.html.erb <%= simple_form_for([:admin, @course, @lesson]) do |f| %> <div class="form-inputs"> <div class="col-md-6"> <%= f.input :start_at, minute_step: 5, start_year

我试图用Bullet gem解决Rails中的每一个n+1问题,但我无法解决这个特殊问题:

\u form.html.erb

<%= simple_form_for([:admin, @course, @lesson]) do |f| %>
  <div class="form-inputs">
    <div class="col-md-6">
    <%= f.input :start_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
    <%= f.input :end_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
       <!--Here is the problem-->
      <%= f.association :room, :label_method => lambda { |room| "#{room.title} (#{room.building.title})"}%>
       <!--Here is the problem-->
    </div>
    <div class="col-md-6">
      <%= f.association :teacher, :label_method => lambda { |teacher| "#{teacher.first_name} #{teacher.last_name}"},
      collection: @course.teachers%>
    </div>
  </div>
<div class="col-md-12">
  <div class="form-actions text-center">
    <%= f.submit class: "btn btn-primary btn-lg" %>
  </div>
</div>
<% end %>
module Admin
  class LessonsController < Admin::AdminController
    helper_method :convert_time, :convert_day
    before_action :set_course
    before_action :set_lesson, only: [:show, :edit, :update, :destroy]

    def index
      @lessons = Lesson.includes(:teacher,:course, :room => :building).where(course_id: @course).paginate(page: params[:page], per_page: 10)
    #  @course_lessons = @course.lessons.paginate(page: params[:page], per_page: 10)

    end

    def new
      #@room = Room.all.includes(:building)
      @lesson = Lesson.new
    end

    def create
      @lesson = Lesson.new(lesson_params)
      @lesson.course = @course
      if @lesson.save
        flash[:success] = "Lesson was created"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'new'
      end
    end

    def edit

    end

    def update
      if @lesson.update(lesson_params)
        flash[:success] = "Lesson was updated"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'edit'
      end

    end

    def show

    end

    def destroy
      @lesson.destroy
      flash[:danger] = "Lesson was deleted"
      redirect_to admin_course_lessons_path(@course)
    end



    private

    def set_course
      @course = Course.find(params[:course_id])
    end

    def set_lesson
      @lesson = Lesson.find(params[:id])
    end

    def lesson_params
      params.require(:lesson).permit(:start_at,:end_at, :room_id, :teacher_id)
    end
  end
end
class Room < ApplicationRecord
  belongs_to :building
  has_many :lessons, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: {case_sensitive: false}
  validates :code, presence: true,
            length: {minimum: 2},
            uniqueness: {case_sensitive: false}
  validates :building_id, presence: true


end
class Building < ApplicationRecord
  has_many :rooms, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: true
  validates :code, presence: true,
            length: {minimum: 3},
            uniqueness: {case_sensitive: false}

end

lambda{room}“{room.title}({room.building.title})”}%>
lambda{老师}“{老师.名字}{老师.姓氏}”,
集合:@course.teachers%>
表单被呈现到new.html.erbedit.html.erb。问题出现在我试图获取room.building.title的房间关联线上

以下是截图:

正如你们所看到的,我只想用它的中心名来显示房间名,但Bullet抛出了一个错误。问题是我正在使用lambda函数,所以在控制器中创建变量并没有帮助(或者至少我不知道如何正确创建它),因为问题发生在选择框中。 这里我包括我的控制器:

课程\u控制器.rb

<%= simple_form_for([:admin, @course, @lesson]) do |f| %>
  <div class="form-inputs">
    <div class="col-md-6">
    <%= f.input :start_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
    <%= f.input :end_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
       <!--Here is the problem-->
      <%= f.association :room, :label_method => lambda { |room| "#{room.title} (#{room.building.title})"}%>
       <!--Here is the problem-->
    </div>
    <div class="col-md-6">
      <%= f.association :teacher, :label_method => lambda { |teacher| "#{teacher.first_name} #{teacher.last_name}"},
      collection: @course.teachers%>
    </div>
  </div>
<div class="col-md-12">
  <div class="form-actions text-center">
    <%= f.submit class: "btn btn-primary btn-lg" %>
  </div>
</div>
<% end %>
module Admin
  class LessonsController < Admin::AdminController
    helper_method :convert_time, :convert_day
    before_action :set_course
    before_action :set_lesson, only: [:show, :edit, :update, :destroy]

    def index
      @lessons = Lesson.includes(:teacher,:course, :room => :building).where(course_id: @course).paginate(page: params[:page], per_page: 10)
    #  @course_lessons = @course.lessons.paginate(page: params[:page], per_page: 10)

    end

    def new
      #@room = Room.all.includes(:building)
      @lesson = Lesson.new
    end

    def create
      @lesson = Lesson.new(lesson_params)
      @lesson.course = @course
      if @lesson.save
        flash[:success] = "Lesson was created"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'new'
      end
    end

    def edit

    end

    def update
      if @lesson.update(lesson_params)
        flash[:success] = "Lesson was updated"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'edit'
      end

    end

    def show

    end

    def destroy
      @lesson.destroy
      flash[:danger] = "Lesson was deleted"
      redirect_to admin_course_lessons_path(@course)
    end



    private

    def set_course
      @course = Course.find(params[:course_id])
    end

    def set_lesson
      @lesson = Lesson.find(params[:id])
    end

    def lesson_params
      params.require(:lesson).permit(:start_at,:end_at, :room_id, :teacher_id)
    end
  end
end
class Room < ApplicationRecord
  belongs_to :building
  has_many :lessons, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: {case_sensitive: false}
  validates :code, presence: true,
            length: {minimum: 2},
            uniqueness: {case_sensitive: false}
  validates :building_id, presence: true


end
class Building < ApplicationRecord
  has_many :rooms, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: true
  validates :code, presence: true,
            length: {minimum: 3},
            uniqueness: {case_sensitive: false}

end
模块管理
类lessonscoontroller:建筑)。其中(课程id:@course)。分页(第页:参数[:页],每页:10)
#@course\u-lessons=@course.lessons.paginate(第页:参数[:页],每页:10)
结束
def新
#@房间=房间。全部包括(:建筑)
@新课
结束
def创建
@LESSION=LESSION.new(LESSION_参数)
@lesson.course=@course
如果@lesson.save
flash[:success]=“课程已创建”
重定向到管理课程课程路径(@course)
其他的
呈现“新”
结束
结束
定义编辑
结束
def更新
如果@lesson.update(lesson_参数)
flash[:success]=“课程已更新”
重定向到管理课程课程路径(@course)
其他的
渲染“编辑”
结束
结束
def秀
结束
def销毁
@毁灭
flash[:danger]=“课程已删除”
重定向到管理课程课程路径(@course)
结束
私有的
设定航向
@course=course.find(参数[:course\u id])
结束
def set_课程
@lesson=lesson.find(参数[:id])
结束
def参数
参数要求(:课)。许可(:开始时间,:结束时间,:房间id,:教师id)
结束
结束
结束
(在这种情况下,与我们相关的行动是新的和编辑的)

以下是相关模型:

room.rb

<%= simple_form_for([:admin, @course, @lesson]) do |f| %>
  <div class="form-inputs">
    <div class="col-md-6">
    <%= f.input :start_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
    <%= f.input :end_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
       <!--Here is the problem-->
      <%= f.association :room, :label_method => lambda { |room| "#{room.title} (#{room.building.title})"}%>
       <!--Here is the problem-->
    </div>
    <div class="col-md-6">
      <%= f.association :teacher, :label_method => lambda { |teacher| "#{teacher.first_name} #{teacher.last_name}"},
      collection: @course.teachers%>
    </div>
  </div>
<div class="col-md-12">
  <div class="form-actions text-center">
    <%= f.submit class: "btn btn-primary btn-lg" %>
  </div>
</div>
<% end %>
module Admin
  class LessonsController < Admin::AdminController
    helper_method :convert_time, :convert_day
    before_action :set_course
    before_action :set_lesson, only: [:show, :edit, :update, :destroy]

    def index
      @lessons = Lesson.includes(:teacher,:course, :room => :building).where(course_id: @course).paginate(page: params[:page], per_page: 10)
    #  @course_lessons = @course.lessons.paginate(page: params[:page], per_page: 10)

    end

    def new
      #@room = Room.all.includes(:building)
      @lesson = Lesson.new
    end

    def create
      @lesson = Lesson.new(lesson_params)
      @lesson.course = @course
      if @lesson.save
        flash[:success] = "Lesson was created"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'new'
      end
    end

    def edit

    end

    def update
      if @lesson.update(lesson_params)
        flash[:success] = "Lesson was updated"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'edit'
      end

    end

    def show

    end

    def destroy
      @lesson.destroy
      flash[:danger] = "Lesson was deleted"
      redirect_to admin_course_lessons_path(@course)
    end



    private

    def set_course
      @course = Course.find(params[:course_id])
    end

    def set_lesson
      @lesson = Lesson.find(params[:id])
    end

    def lesson_params
      params.require(:lesson).permit(:start_at,:end_at, :room_id, :teacher_id)
    end
  end
end
class Room < ApplicationRecord
  belongs_to :building
  has_many :lessons, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: {case_sensitive: false}
  validates :code, presence: true,
            length: {minimum: 2},
            uniqueness: {case_sensitive: false}
  validates :building_id, presence: true


end
class Building < ApplicationRecord
  has_many :rooms, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: true
  validates :code, presence: true,
            length: {minimum: 3},
            uniqueness: {case_sensitive: false}

end
教室
building.rb

<%= simple_form_for([:admin, @course, @lesson]) do |f| %>
  <div class="form-inputs">
    <div class="col-md-6">
    <%= f.input :start_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
    <%= f.input :end_at, minute_step: 5, start_year: Date.today.year %>
    </div>
    <div class="col-md-6">
       <!--Here is the problem-->
      <%= f.association :room, :label_method => lambda { |room| "#{room.title} (#{room.building.title})"}%>
       <!--Here is the problem-->
    </div>
    <div class="col-md-6">
      <%= f.association :teacher, :label_method => lambda { |teacher| "#{teacher.first_name} #{teacher.last_name}"},
      collection: @course.teachers%>
    </div>
  </div>
<div class="col-md-12">
  <div class="form-actions text-center">
    <%= f.submit class: "btn btn-primary btn-lg" %>
  </div>
</div>
<% end %>
module Admin
  class LessonsController < Admin::AdminController
    helper_method :convert_time, :convert_day
    before_action :set_course
    before_action :set_lesson, only: [:show, :edit, :update, :destroy]

    def index
      @lessons = Lesson.includes(:teacher,:course, :room => :building).where(course_id: @course).paginate(page: params[:page], per_page: 10)
    #  @course_lessons = @course.lessons.paginate(page: params[:page], per_page: 10)

    end

    def new
      #@room = Room.all.includes(:building)
      @lesson = Lesson.new
    end

    def create
      @lesson = Lesson.new(lesson_params)
      @lesson.course = @course
      if @lesson.save
        flash[:success] = "Lesson was created"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'new'
      end
    end

    def edit

    end

    def update
      if @lesson.update(lesson_params)
        flash[:success] = "Lesson was updated"
        redirect_to admin_course_lessons_path(@course)
      else
        render 'edit'
      end

    end

    def show

    end

    def destroy
      @lesson.destroy
      flash[:danger] = "Lesson was deleted"
      redirect_to admin_course_lessons_path(@course)
    end



    private

    def set_course
      @course = Course.find(params[:course_id])
    end

    def set_lesson
      @lesson = Lesson.find(params[:id])
    end

    def lesson_params
      params.require(:lesson).permit(:start_at,:end_at, :room_id, :teacher_id)
    end
  end
end
class Room < ApplicationRecord
  belongs_to :building
  has_many :lessons, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: {case_sensitive: false}
  validates :code, presence: true,
            length: {minimum: 2},
            uniqueness: {case_sensitive: false}
  validates :building_id, presence: true


end
class Building < ApplicationRecord
  has_many :rooms, dependent: :destroy
  before_save {self.title = title.upcase_first}
  before_save {self.code = code.upcase}

  validates :title, presence: true,
            length: { minimum: 3, maximum: 50},
            uniqueness: true
  validates :code, presence: true,
            length: {minimum: 3},
            uniqueness: {case_sensitive: false}

end
班级建设

很抱歉这篇长文章和我的知识不足。我将非常感谢您的反馈。

您可以使用
f.association
中的
includes
指定
集合
选项。像这样:


f.association:room,:label_method=>lambda{124; room |“{room.title}({room.building.title})”,:collection=>room.includes(:building)。all}

能否尝试在
f.association
中指定
collection
选项,然后使用
includes
来避免N+1查询问题?我的意思是像这样的
f.association:room,:label_method=>lambda{124; room |“{room.title}({room.building.title})”,:collection=>room.includes(:building)。all}
是的,解决了这个错误:)我不知道它可以用这种方式解决,非常感谢。(我不知道如何将你的评论标记为解决方案,所以我只是投赞成票)酷,我将把它作为一个答案:)