Rails管理面板加载缓慢

时间:2016-03-15 11:23:51

标签: ruby-on-rails mongodb mongoid panel rails-admin

我目前正在使用Mongoid ORM进行rails项目。我在服务器端使用Rails admin gem进行数据处理。 Rails版本是4.1.7,Ruby是2.1.5。问题是第一次加载管理面板时需要花费大量时间。

我检查了铁轨的日志。它似乎从" user"查询每个用户。表和当前加载面板所花费的时间与用户表中的条目数成正比。

请帮我快速加载面板。如果需要任何其他信息,请询问。感谢。

以下是rails log的快照。

 MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('5656bd857261693fb10a0000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 10.0400ms
  MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('56ae41fe72616930bf030000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 0.4920ms
  MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('567d01277261695b8a000000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 5.1850ms
  MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('568cad1a7261691ff2030000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 0.5010ms
  MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('561144df726169602d000000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 2.4130ms
  MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('56ae487e72616930bf460000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 0.4500ms
  MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('567d01277261695b8a000000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 5.1940ms
  MOPED: 127.0.0.1:27017 QUERY        database=yeloapp_development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('56aa51f972616944d1300000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields
=nil runtime: 6.2580ms

Ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    #   user ||= User.new # guest user (not logged in)
    #   if user.admin?
    #     can :manage, :all
    #   else
    #     can :read, :all
    #   end
    #
    # The first argument to `can` is the action you are giving the user
    # permission to do.
    # If you pass :manage it will apply to every action. Other common actions
    # here are :read, :create, :update and :destroy.
    #
    # The second argument is the resource the user can perform the action on.
    # If you pass :all it will apply to every resource. Otherwise pass a Ruby
    # class of the resource.
    #
    # The third argument is an optional hash of conditions to further filter the
    # objects.
    # For example, here the user can only update published articles.
    #
    #   can :update, Article, :published => true
    #
    # See the wiki for details:
    # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
    if user &&  user.admin_type == 1
      can :access, :rails_admin       # only allow admin users to access Rails Admin
      can :dashboard  
      can :manage, :all
    end
    if user && user.is_admin? 
      can :access, :rails_admin       # only allow admin users to access Rails Admin
      can :dashboard  
      can :read, :all
      can :manage, :statistic
    end
  end
end

rails_admin.rb

RailsAdmin.config do |config|

  ### Popular gems integration
  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :user
  end
  config.current_user_method(&:current_user)

  ## == Cancan ==
  #config.authorize_with :cancan

  ## == PaperTrail ==
  # config.audit_with :paper_trail, 'User', 'PaperTrail::Version' # PaperTrail >= 3.0.0

  ### More at https://github.com/sferik/rails_admin/wiki/Base-configuration

  config.actions do
    dashboard                     # mandatory
    index                         # mandatory
    new
    export
    bulk_delete
    show
    edit
    delete
    show_in_app

    ## With an audit adapter, you can add:
    # history_index
    # history_show
  end
end

编辑:我解决了问题(见答案)。但我仍然想知道为什么加载这么慢的原因。感谢帮助。

1 个答案:

答案 0 :(得分:2)

所以我通过明确地将我想要显示的模型列入白名单来解决这个问题。所以我更改了rails_admin.rb文件。

rails_admin.rb

RailsAdmin.config do |config|

  ### Popular gems integration
  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :user
  end
  config.current_user_method(&:current_user)

  # this is the way to whitelist the models
  config.included_models = [write the name of models you want to show at rails panel]


  ## == Cancan ==
  config.authorize_with :cancan

  ## == PaperTrail ==
  # config.audit_with :paper_trail, 'User', 'PaperTrail::Version' # PaperTrail >= 3.0.0

  ### More at https://github.com/sferik/rails_admin/wiki/Base-configuration

  config.actions do
    dashboard                     # mandatory
    index                         # mandatory
    new
    export
    bulk_delete
    show
    edit
    delete
    show_in_app

    ## With an audit adapter, you can add:
    # history_index
    # history_show
  end
end

希望它可以帮助别人。