我是Rails的初学者,现在已经阅读了教程并输入了几个月的应用程序。在前端世界度过了几年之后,我真的很享受它,并开始快速适应这一切。现在是时候让我开始构建我自己的东西而不需要任何手握。到目前为止,非常好。
我正在创建一个基本的待办事项列表应用,其目标和任务显示在相同页面 - goals #index上。我的问题是,我不确定如何为特定目标(属于用户)获取所有任务。我知道我需要将ID参数传递给目标模型才能找到它的任务,如下所示:
Goal.find(1).tasks
以上工作正常,因为我已经在任务表上设置了外键,并且具有目标模型的has_many:tasks关系和Task模型的belongs_to关系。
这是我的目标控制者:
def index
@user = current_user
@goals = @user.goals # list all goals for the current user and assign it to the @goals variable.
# Need to find all tasks for each goal ID and assign it to the @tasks variable. Goal ID needs to be supplied here, but it isn't as we're not in show action.
@tasks = Goal.find(1).tasks
正如我所说,当我手动输入ID(本例中为1)时,我可以找到目标的所有任务。这在我的应用程序中工作正常,没有错误。但显然我想动态提供这些ID,而我只是不确定如何在那里获得参数。
我试过以下内容:
@tasks = Goal.find(params[:id]).tasks
和
@tasks = Goal.find(params[:goal_id]).tasks
我得到了#34;无法找到没有ID的目标"我尝试在视图中迭代@tasks时出错。这是有道理的,因为我不认为目标参数被传递给它,因为我们不在Show行动中。
当然必须有一个简单的Rails方式?!我很难过,也不知道该往哪里看。感谢您的帮助和新年快乐。
答案 0 :(得分:3)
您正在获得当前用户的目标,因此当您执行此操作时,您将拥有一个数组对象。所以当你将数组对象传递给find时,它将有多个IDS。因此,当需要从所有目标中找到所有任务时,您只需要传递IDS数组而不是单个值。
@tasks = Task.where(:goal_id => @goals)
这将运行此SQL查询。
SELECT“tasks”。* FROM“tasks”WHERE“tasks”。“goal_id”IN(SELECT “目标”。“id”来自“目标”)
所以当你处理数组时只需传递id。例如[1,2,3]
答案 1 :(得分:2)
一旦你@goals = @user.goals
(假设它正常工作,它听起来像是这样),你就有了自己的目标,没有理由回到数据库去找"找到&#34 34;它们。
要从用户的所有目标中获取所有任务,您可以执行以下操作:
@tasks = []
@goals.each do |goal|
@tasks << goal.tasks
end
答案 2 :(得分:0)
当然啊,@ goals是用户目标的一个数组,所以我可以使用它。当有人告诉你时,这么简单。感谢你的帮助!
这是我的最终代码(我保持控制器不变)。这将获得数组中的第一个目标,然后获取与每个目标相关联的任务。我有一定数量的目标,所以我可以为每个目标使用目标[0],目标[1]或目标[2]。
<% @goals[0].tasks.each do |task| %>
<li><div class="task-item"><%= task.task_name %></div></li>
<% end %>