繁体   English   中英

在Rails中显示具有直通关系的模型中的数据

[英]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>&nbsp;</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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM