[英]In Rails display data from models with through relationships
我正在努力在使用has_many并通过关系的表中仅显示RELEVANT数据。 我的模型如下:
class TrainingResource
has_many :user_training_resources, dependent: :destroy
end
class UserTrainingResource
belongs_to :user
belongs_to :training_resource
end
class Users
has_many :user_training_resources, dependent: :destroy
has_many :training_resources, through: :user_training_resources
end
最终,我想在“具有培训资源”及其当前状态以及用户删除该资源(用户培训资源)能力的那些用户的“培训资源显示”页面上构建表格。
因此,示例在查看Alpha培训资源时,用户会看到培训资源:名称,说明,URL和总订阅数。 然后在经过Alpha培训的用户列表及其当前状态以及删除该选项的选项下面。
class Admin::TrainingResourcesController < Admin::ApplicationController
belongs_to_app :training_resources
add_breadcrumb 'Training Resources', :admin_training_resources_path
before_action :load_training_resource, only: [:show, :edit, :update, :destroy]
respond_to :html, :json
def show
@user_training_resources = UserTrainingResource.all
@users = User.all
respond_with(@training_resource)
end
private
def load_training_resource
@training_resource = TrainingResource.find_by!(id: params[:id])
end
end
我的培训资源显示模板如下所示:
<dl class="dl-horizontal">
<dt>Name:</dt>
<dd><%= @training_resource.name %></dd>
<dt>Description:</dt>
<dd><%= @training_resource.description %></dd>
<dt>Subscriptions Available:</dt>
<dd><%= @training_resource.subscriptions_available %></dd>
<dt>Total Subscriptions:</dt>
<dd><%= @training_resource.total_subscriptions %></dd>
<dt>Url:</dt>
<dd><%= @training_resource.url %></dd>
</dl>
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Name</th>
<th>Training Resource Names</th>
<th>Status</th>
<th> </th>
</tr>
</thead>
<tbody>
<% @users.all.each do |user| %>
<tr>
<td><%= user.full_name %></td>
<td><%= user.training_resources.map(&:name).join(', ') %></td>
<td><% user.user_training_resources.each do |user_training_resource| %></td>
<td><%= user_training_resource.status %></td>
<% end %>
<td class="table-actions">
<%# <%= link_to 'Delete', admin_user_training_resource_path(@user_training_resource), :method => :delete, :data => {:confirm => 'Are you sure you want to delete this Training resource?'}, :class => 'btn btn-danger btn-sm' %> %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
因此,如果我转到“培训资源”并单击“ Alpha”节目,则会看到其名称,说明,总订阅数和网址。 但是,下表将显示所有用户,他们的所有培训资源以及状态。 不完全是我想要的。
我尝试做以下类似的事情,希望只是通过培训资源:
<% @training_resource.each do |training_res| %>
<%= training_res.name %>
<% end %>
这导致未定义的方法“每个”。 那么,如何仅显示与TrainingResource相关的数据?
在模型TrainingResource
中为users
添加新的关联,以便您可以直接获取所有用户的training_resource记录。
class TrainingResource
has_many :user_training_resources, dependent: :destroy
has_many :users, through: :user_training_resources
end
将您的控制器动作show
更改为如下所示:
def show
respond_with @training_resource
end
并通过以下方式在training_resource显示页面上的<tbody>
标记内显示用户:
<% @training_resource.users.each do |user| %>
<tr>
<td><%= user.full_name %></td>
<!-- If you want to display all the training_resources of the user and their statuses -->
<td><%= user.training_resources.map(&:name).join(', ') %></td>
<td><%= user.user_training_resources.map(&:status).join(', ')</td>
<td class="table-actions">
<!-- Assuming your path is something like '/admin/training_resources/:id/users/:user_id' -->
<%= link_to 'Delete', admin_user_training_resource_path(@training_resource, user), method: :delete, data: { confirm: 'Are you sure you want to delete this Training resource?' }, class: 'btn btn-danger btn-sm' %>
</td>
</tr>
<% end %>
此代码未经测试。 因此,如果您遇到任何错误,请告诉我。
更新
如果只想为所有用户显示当前training_resource的状态,请执行以下操作:
<%- utr = user.user_training_resources.where(training_resource: @training_resource).first %>
<td><%= utr.status %></td>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.