【问题标题】:acts_as_relation for multiple inheritance rails 4多重继承rails 4的acts_as_relation
【发布时间】:2014-06-10 19:32:44
【问题描述】:

我正在使用acts_as_relation link gem 来实现模型之间的多重继承。如下

# model/m.rb
class M < ActiveRecord::Bas
  has_many :m_sgs
  accepts_nested_attributes_for :m_sgs
end

# model/m_sg.rb
class MSg < ActiveRecord::Base
  belongs_to :m
  acts_as_superclass
end

# model/m_sg_w.rb
class MSgW < ActiveRecord::Base
  acts_as :m_sg
end

# model/m_sg_b.rb
class MSgB < ActiveRecord::Base
  acts_as :m_sg
end

一切正常,但是当我尝试像这样访问时查询非常慢

<% M.all.each do |s| %>
  <% if s.as_m_sg_type.to_s == 'MSgW' %>
    <tr><td width="15%">mwid</td><td><%= s.specific.mwid %></td></tr>
    <tr><td width="15%">mwuserid</td><td><%= s.specific.mwuser_id %></td></tr>
  <% end %>
 <% end %>

我检查了日志,每当我提出特定请求时,它都会发送一个新的 Select 请求,该请求仅返回 1 行,这是错误的,因为默认情况下“acts_as_relation”提供了 auto_joins。所以请帮我改进这个因为数据检索很慢

【问题讨论】:

  • 在你的代码示例中,我看到你迭代了M,你如何迭代相关的MSg? (我真诚地希望这不是你真正的类名)。

标签: ruby-on-rails activerecord ruby-on-rails-4 multiple-inheritance eager-loading


【解决方案1】:

看起来:auto_join 功能适用于另一种方式的查询(从子级到父级)。您可以在加载M 记录时尝试includes

@m = M.includes(:m_sgs).all

或许

@m = M.includes(m_sgs: :as_m_sg).all

更新

这是我认为 gem 正在添加的关联代码:

#model/m.rb
class M < ActiveRecord::Bas
  has_many :m_sgs
  accepts_nested_attributes_for :m_sgs
end

#model/m_sg.rb
class MSg < ActiveRecord::Base
  belongs_to :m

  acts_as_superclass
  # belongs_to :as_m_sg, polymorphic: true
end

#model/m_sg_w.rb
class MSgW < ActiveRecord::Base
  acts_as :m_sg
  # has_one :m_sg, as: :as_m_sg, class_name: MSg, autosave: true, validate: false, dependent: destroy
  # default_scope -> { joins(:m_sg) }
end

#model/m_sg_b.rb
class MSgB < ActiveRecord::Base
  acts_as :m_sg
  # has_one :m_sg, as: :as_m_sg, class_name: MSg, autosave: true, validate: false, dependent: destroy
  # default_scope -> { joins(:m_sg) }
end

【讨论】:

  • 是的,根据文档,它应该可以在没有包含的情况下工作,但我之前已经尝试过这个解决方案......它不起作用......
  • auto_join 仅在您查询子类时适用(例如 MSgW.first)。
  • 好的...问题是这样...我不知道...但是如何解决...?
  • 您是否尝试过我的第二个包含示例?根据 gem 的代码,我认为这会起作用。如果您使用的是 MySQL,则应该为每个表提供一个查询。
  • 是的,我也尝试了第二个,但似乎无法正常工作,我正在使用 MySQL,但它应该返回一个数组或对象..对于第二种情况只想知道....
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2012-03-07
相关资源
最近更新 更多