Rails 管理面板加载缓慢

Rails admin panel loading slow

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

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

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

以下是 rails 日志的快照。

 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

编辑:我解决了问题(参见答案)。但我还是想知道加载速度这么慢的原因。感谢帮助。

所以我通过明确地将我想展示的模型列入白名单来解决这个问题。所以我更改了 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

希望对其他人有所帮助。

Disabling record count bars:

您可以通过操作配置隐藏仪表板统计图表。这在处理需要很长时间才能查询的庞大数据集时很有用。

请注意,一旦您开始配置操作,它只会加载您指定的操作,因此如果您想禁用统计信息同时将其他所有内容保持为默认设置,那么您需要包括所有操作,如下所示:

RailsAdmin.config do |c|
  c.actions do
    dashboard do
      statistics false
    end
  end
end

请注意,禁用统计信息会删除整个仪表板 table,而不仅仅是彩色图表。

More here