在具有多个 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])
我目前正在尝试加速一个旧的 (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])