我有一个具有以下结构的应用程序:
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"根据最佳实践,完成这项任务的方法是什么?
答案 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对象获取膳食计划和食谱详细信息。