【问题标题】:Preventing repetition through iteration - inbuilt function .uniq [rails4]通过迭代防止重复 - 内置函数 .uniq [rails4]
【发布时间】:2014-09-10 20:53:51
【问题描述】:

我是 Rails 新手 - 任何帮助都将不胜感激。 我想知道我如何实现 rails 内置函数“.uniq” -

  1. 我只想在我的 index.html.erb 页面中显示活动组织者 - 也就是说,我只想仅显示创建了活动的用户

  2. 用户A创建了2个事件,用户B创建了14个事件,用户C创建了0个事件

  3. 当我遍历@events并调用event.user.full_name时——用户A的名字出现了2次,用户B的名字出现了14次,用户C的名字没有出现

问题:如何让用户 A 的姓名和用户 B 的姓名仅显示 一次(使用 rails 内置方法“.uniq”),尽管两个用户都创建了多个事件。我愿意接受除 rails 功能以外的任何其他建议。 - 非常感谢

我已将所有代码放在下面:

视图:app/views/users/index.html.erb

<% @event.each do |event| %>
    <%= event.user.full_name %>
<% end %>

模型:user.rb & event.rb

class User < ActiveRecord::Base
  has_many :events, dependent: :destroy
end

class Event < ActiveRecord::Base
  belongs_to :user
end

控制器:user_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show]
  before_filter :authenticate_user!

  # GET /users
  # GET /users.json
  def index
    @users = User.all
    @event = Event.all
  end

  # GET /users/1
  # GET /users/1.json
  def show
    @user = User.find(params[:id])
    @events = @user.events.order(:date)
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:email, :password, :password_confirmation, :firstname, :lastname, :dob, :gender, :description, :role)
    end
end

【问题讨论】:

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


    【解决方案1】:

    在:

    def index
      @users = User.all
      @event = Event.all
    end
    

    @event = Event.all 更改为:

    @event = Event.all.to_a.uniq { |e| e.user.full_name }
    

    这回答了您的具体问题,但您仍在加载所有事件以及与这些事件相关的所有用户,只是为了显示名称列表。

    我会尝试这样的事情:

    def index
      @users = User.all
      @users_with_events = User.joins(:events).uniq
    end
    

    @users_with_events 应简化为具有事件关系的用户集。

    【讨论】:

      【解决方案2】:

      两种方式。您可以根据用户对@event 数组进行分组

      <% @event.group_by(&:user).each do |user, events| %>
          <%= user.full_name %>
      <% end %>
      

      或者,使用@user 数组

      <% @user.each do |user| %>
          <%if user.events.count > 0%>
             <%= user.full_name %>
          <%end%>
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 2015-06-09
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 2013-12-27
        相关资源
        最近更新 更多