- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有这样的表格结构:
用户
id | name
1 | John
2 | Peter
3 | Claire
服务
id | name
1 | home
2 | garden
3 | music
用户服务
id | user_id | services_id
1 | 1 | 3
2 | 2 | 3
3 | 1 | 2
型号:用户.rb
class User < ActiveRecord::Base
has_many :user_services, dependent: :destroy
has_many :services, through: :user_services
end
user_service.rb
class UserService < ActiveRecord::Base
belongs_to :user
belongs_to :service
validates_uniqueness_of :service_id, scope: :user_id
end
服务.rb
class Service < ActiveRecord::Base
has_many :user_services
has_many :users, through: :user_services
end
这就是我所做的( Controller ):
def do_search
@results = search_users
@users_a = []
@users_b = []
@results[:users].each do |result|
is_user_b = 0
result.user_services.each do |service|
if service.service_id == 28
@users_a << "a string..."
is_user_b = 1
break
end
end
if is_user_b == 0
@users_b << "string B"
end
end
render "results_users"
end
def search_users
@users = User.within(distance, origin: city).where('gender = ?', 0).order("distance ASC")
end
在 View 中:
<% @results[:users].each do |result| %>
<li data-services="<% result.services.each do |service| %><%= service.name %>,<% end %>">
<div><%= result.facility_name %></div>
<ul class='service-icons cf'>
<% result.services.each do |service| %>
<li class='service-icon'>
<span class="streamline" aria-hidden="true" data-icon="<%= raw service.icon %>" title="<%= service.label %>"></span>
</li>
<% end %>
</ul>
</li>
<% end %>
问题:此流程非常慢 - SQL 查询非常快(0.4 秒),但是处理这 3 个循环(1 个在 Controller 中,2 个在 View 中)非常慢,这导致显示结果持续大约 < strong>60 秒。
这让我很惊讶,因为我有几乎相同的模型,但是有cars
(cars
, services
, car_services
), 几乎与 users
相同数量的属性 (cars
), 在 cars
中是 600k 记录, 在 users
90K 仅需 2 秒即可完成。我花了一整天试图找出原因,但仍然不明白这怎么可能。
谁能帮帮我,为什么遍历 has_many 关联要花这么多时间? (如果我评论所有 3 个循环,页面将在 2 秒内加载)
提前感谢您的宝贵时间。
最佳答案
实际上 Active Record 在处理大型数据集方面真的很糟糕。
然而,您应该做的第一件事是通过预先加载相关记录来避免代码在这些循环中执行的大量 n+1 查询,这些记录将在迭代中访问
User.includes(:user_services, :services).within(...).where(...)
与每次循环迭代发出单独的 +1 查询相比,一次获取所有记录要快得多。
您还应该考虑为用户及其服务引入分页或一些其他用户发起的额外抓取(例如“显示更多”)。无论如何,人类将难以处理大量数据。
如果此优化不充分并且一次获取所有数据的要求是不可协商的,那么请使用原始 SQL。为每一行实例化一个 ActiveRecord Objectgraph 的影响是巨大的。通过这种方式,我们已经能够将我们的账单报告从几分钟优化到几秒钟。
我还推荐使用“rack-mini-profiler”gem 来分析性能问题。
关于mysql - Rails + MySQL - 从具有特定格式的 3 个表加载数据(非常慢 "has_many"关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216956/
我有一个具有以下模型的应用程序:- 类别- 子类别- 产品- 产品子类别 我的关系如下: Category has_many :subcategories Subcategory belongs_to
看来 rails 仍然不支持这种类型的关系并抛出 ActiveRecord::HasManyThroughAssociationPolymorphicThroughError 错误。 我该怎么做才能实
我想知道我可以在多大程度上使用 Rails 中的关联。考虑以下因素: class User :provider end class Provider :businesses belongs
我是 Rails 的新手。我想知道我是否需要将 add_index 添加到两个迁移? 我正在尝试定义用户和事件。每个用户可以有多个事件,每个事件可以有多个用户。所以我会做这样的事情: class Us
我有这个: class User :series end class Serial :serials end class Episode < ActiveRecord::Base belong
我一直致力于一个大量使用模型关联的项目,似乎我发现了 has_many 或 has_one through 功能与 :conditions 功能冲突的情况。简而言之,问题是 through 关联为 h
模拟以下情况的最佳方法是什么: Word belongs_to :wordable, :polymorphic => true Phrase has_many :words, :as => :
这似乎是一个典型的问题,但很难搜索。 我想选择用户通过 has_many 拥有的项目和用户通过 has_many through 关联的项目。 考虑以下模型: class User < ActiveR
首先对英语感到抱歉 所以我已经有了“用户 - 帖子”一对多关联,这意味着每个帖子只能有一个作者,现在我想在用户个人资料中添加“最喜欢的帖子”按钮,以及“添加到收藏夹”按钮每个帖子,所以问题是如何实现这
我有一个用户模型,允许用户关注其他用户。每个用户也有很多东西: class User has_many :following, :class_name => 'Followings', :fore
我正在使用 Rails 4.1 和 Ruby 2.1。 一个用户 has_many 辆车,和一辆车 has_many 约会。获取所有用户约会的最简单方法是什么? 理想情况下,我想做这样的事情:user
我想为 has_many/has_many 关系定义一个工厂(我想我做对了)但是我不知道如何为这些创建的工厂的每个对象定义属性。 这是主页,这是交易卡片的列表 我们假设下面的主页 View 是针对登录
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我有一个 has many through 关系来定义用户已回答的问题。 如何为用户创建的问题建立关系? 通常你会在用户和问题之间创建一个 has_many 和 belongs_to 关系,但是因为我
例如,在 class Student < ActiveRecord::Base has_many :awards end class Awards < ActiveRecord::Base b
我仍然在尝试如何处理在Ecto中创建/更新has_many, through:关联。我已经重新阅读了José's关于关联以及the docs的帖子,但我仍在努力。 我所拥有的是: 网站/模型/dish
# == Schema Information # # Table name: orders # # id :integer not null, pri
我正在尝试从 EventView.promoter_id = User.id 的用户获取事件,但它无法正常工作。这是我的设置(目前不正确): User has_many :events has_man
我有三门课 TeamMember , Service和ServiceTeamMember 我有 class Service has_many :service_team_members has
我需要列出所有用户及其销售的产品总量及其电子邮件和产品总量, class User :user).group('users.email').sum(:quantity) 关于mysql - 事件记录
我是一名优秀的程序员,十分优秀!