在具有多个 HABTM 的 simple_form 期间限制对数据库的调用量

Limiting down the amount of calls to the database during a simple_form with multiple HABTM

我目前正在尝试加速一个旧的 (3.2) Rails 应用程序并遇到一个问题,即在使用 simple_form[=20 的编辑视图期间对数据库进行了太多调用=]

这是简化的设置;

class Event
  HABTM Speakers
  HABTM Sponsors

class Speaker
  belongs_to Sponsor
  HABTM Events

class Sponsor
  have_many Speakers
  HABTM Events

对于一个活动,我们希望同时展示每个潜在的演讲者(其中有数千人)和所有赞助商(数百人)。

对于每个有赞助商的演讲者,他们需要显示赞助商名称。

这一切加起来 很多 调用 sponsors table,太多了。

当前代码

现在 simple_form 设置为;

<%= simple_form_for [:admin, @event] do |f| %>
...
<%= f.association :speakers, :input_html => { :class => 'select2able' }, :label_method => :summary %>
...
<%= f.association :sponsors, :input_html => { :class => 'select2able' } %>
...

那个标注方法在speaker模型上;

delegate :name, to: :sponsor, prefix: true, allow_nil: true

def summary
  [name, job_title, sponsor_name].compact.join ' - '
end

@event 变量在控制器中使用简单的

分配
@event = Event.find params['id']

这是我花了大部分时间尝试改进的地方。

我试过的

打电话给 Event.includes(:speakers => :sponsor).find() 我想会有帮助。但它根本没有。

我也试过单独包括演讲者和赞助商。

我四处寻找对 simple_form 有疑问的人,但一无所获。我知道这是已经形成的心理结构的标志,但如果我能在不完全重写的情况下改进它,那就太好了。

我最初的尝试就快完成了。

这个版本的 Rails 不喜欢外部包含(它执行但没有应用任何东西)

最终代码略有改动,我将 include 放入 find_by。

Event.find_by_slug(params[:id], :include => [:speakers, :sponsors, :speakers => :sponsor])