创建自定义Rails方法的问题

时间:2017-08-18 14:32:19

标签: ruby-on-rails

我有一个具有以下结构的应用程序:

  • mealplan一周中的每一天都包含一个recipe
  • recipe has_many ingredients
  • grocery是用户购物清单上的一个项目。

我想创建一个自定义方法,以便在点击按钮时,它会在Grocery.create上的ingredient的每个recipes上运行mealplan

我目前使用以下mealplans#index方法,因此您可以看到它们的定义方式。 (所有这一切都发生在index视图:

  def index
    @mealplans = Mealplan.where(user_id: current_user.id)
    @mealplan = Mealplan.new
    @recent = Mealplan.where(user_id: current_user.id).where("created_at > ?", Time.now.beginning_of_week).order("week_starting").last
    @recipes = Recipe.where(user_id: current_user.id)
    @monday = Recipe.where(id: @recent.monday)[0] if @recent.present?
    @tuesday = Recipe.where(id: @recent.tuesday)[0] if @recent.present?
    @wednesday = Recipe.where(id: @recent.wednesday)[0] if @recent.present?
    @thursday = Recipe.where(id: @recent.thursday)[0] if @recent.present?
    @friday = Recipe.where(id: @recent.friday)[0] if @recent.present?
    @saturday = Recipe.where(id: @recent.saturday)[0] if @recent.present?
    @sunday = Recipe.where(id: @recent.sunday)[0] if @recent.present?
  end

我还在控制器中设置了一个虚拟mealplans#add_to_list方法,但我觉得这样做违反了"瘦小的控制器,胖模型"铁轨原则。

任何人都能提醒我进入" railiest"根据最佳实践,完成这项任务的方法是什么?

1 个答案:

答案 0 :(得分:1)

检查gem "nested_form" gem以创建多条记录。

为了更好的实施,请在Mealplan模型下创建范围。

class Mealplan < ActiveRecord::Base
   scope :recent, ->(uid) { where(user_id: uid).where("created_at > ?", Time.now.beginning_of_week).order("week_starting").last}

   # find the day name of recent Mealplan
   def recent_day_name
     created_at.strftime("%A")
   end
end

在控制器中,您可以像这样使用此范围:

def index
  @mealplan = Mealplan.new
  @recent = Mealplan.recent(current_user.id)
  if @recent
    recent_day = @recent.recent_day_name
    @day = Recipe.find(id: @recent.send(recent_day))
  end
end

无需在控制器站点上创建@mealplans@recipes实例变量:

@mealplans = Mealplan.where(user_id: current_user.id)
@recipes = Recipe.where(user_id: current_user.id)

您可以从current_user对象获取膳食计划和食谱详细信息。