在视图中加入表属性

时间:2013-11-21 04:43:08

标签: ruby-on-rails ruby-on-rails-4

我试图在循环中创建一个循环来在视图中呈现一些数据并且遇到一些麻烦。

我有两个模型:用户和任务。

class User < ActiveRecord::Base
    # Associations
    has_many :tasks, dependent: :destroy
end

class Task < ActiveRecord::Base
    # Associations
    belongs_to :user
end

因此,Task模型有一个名为“user_id”的列。

我的目标是在视图中呈现以下内容:

  • User.first_name(#1)
  • 任务1
  • 任务2
  • User.first_name(#2)
  • 任务1
  • 任务2

所以我的观点如下:

<% @users.each do |user| %>
  <div class="col-sm-12 col-md-12 task-header">
    <strong><%= user.first_name %></strong>
  </div>
  <% @tasks.each do |task| %>
    <%= task.title %>
  <% end %>
<% end %>

我正在尝试打印每个用户的名称,并将其所有任务与该特定用户相关联。

控制器:

  def index
    @users = User.all
    @tasks = User.joins(:tasks).where(tasks: {user_id: 1})
  end

这是我感到困惑的地方。我知道我可能需要一起加入表,但是在视图中,一旦表连接起来,我就无法从任务表中提取任何列(或者至少我不知道如何)。

此外,我明确声明user_id = 1.这不是动态的,因此不起作用。如何从循环的第一部分动态获取user_id?

希望你了解我的任务:)

感谢。

2 个答案:

答案 0 :(得分:1)

我认为以下内容将以您希望的格式打印您的用户及其任务。

<强>控制器

def index
  @users = User.all
end

查看

<% @users.to_enum.with_index(1).each do do |user, index| %>
  <div class="col-sm-12 col-md-12 task-header">
    <strong><%= "#{user.first_name} (##{index})" %></strong>
  </div>
  <% user.tasks.to_enum.with_index(1).each do |task, i| %>
    <div><%= "#{task.title} {i}" %></div>
  <% end %>
<% end %>

使用with_index可以指定枚举中的索引。此外,正如您所说,您希望在每个循环中为特定用户执行任务,您不需要在控制器操作中定义@tasks。由于他们的关联定义得恰当,您可以在视图中执行user.tasks

答案 1 :(得分:0)

如果我理解正确,您需要在控制器中使用includes,以便每个用户只执行一次查询而不是n + 1 ...

控制器:

def index
  @users = User.includes(:tasks).all
end

然后在您看来,因为您在User上设置了关联,其中每个User has_many :tasks,您可以这样做:

<% @users.each_with_index do |user, index| %>
  <div class="col-sm-12 col-md-12 task-header">
    <strong><%= user.first_name %></strong>
  </div>
  <% user.tasks.each |task| %>
    <%= task.title %>
  <% end %>
<% end %>

如果字面上想要每个项目旁边的数字,请在每个迭代器上使用each_with_index

<% @users.each_with_index do |user, index| %>
  <div class="col-sm-12 col-md-12 task-header">
    <strong><%= user.first_name %>(#<%= index %>)</strong>
  </div>
  <% user.tasks.each_with_index |task, index| %>
    <%= task.title %>(#<%= index %>)
  <% end %>
<% end %>