【问题标题】:Rails Association, Scope, JoinModelRails 关联、范围、JoinModel
【发布时间】:2013-06-09 10:01:37
【问题描述】:

更新:我们是这样解决的。对两个 sn-ps 代码生成的 sql 运行 MYSQL Explain:

Manifest.where(assembly_id => @assembly.id).where(part_id => @part.id).exists? 没有加入,跑得更快——所以它赢了!

我有以下情况:

class Assembly < ActiveRecord::Base
  has_many :manifests
  has_many :parts, :through => :manifests
end

class Manifest < ActiveRecord::Base
 belongs_to :assembly
 belongs_to :part
end

class Part < ActiveRecord::Base
 has_many :manifests
 has_many :assemblies, :through => :manifests

结束

因此,作为极客,我和我的同事陷入了关于以下问题的有争议的争论:

给定一个零件和一个装配体,查找它们是否在同一个清单中。

解决方案一(使用关联):

 @part.assemblies.include? @assembly

解决方案二(使用范围):

 Manifest.where(assembly_id => @assembly.id).where(part_id => @part.id).exists?

解决方案一通过内部连接来获取数据,这让讨厌跨表的阵营发疯了。但它简洁而不难看。

方案二不做内连接,使用作用域(即where子句),但有点难看。

解决方案一被称为效率低下,在分析时它实际上运行速度稍慢。

关于这种情况的最佳实践的任何想法。

顺便说一句,为了说明问题,我从 Rails 指南中获取了代码。

【问题讨论】:

  • @part.assemblies.find(@assembly.id)

标签: ruby-on-rails activerecord scopes


【解决方案1】:

我会选择以下两种方式之一,不是出于性能原因,只是为了表达清晰:

是否有属于@assembly 和@part 的清单?

Manifest.where(assembly_id: @assembly.id, part_id: @part.id).any?

或者,@assembly 和 @part 是否共享任何清单?

(@assembly.manifests & @part.manifests).any?

【讨论】:

  • 感谢@AJcodez。但最后我试图尽量减少 sql 查询对我的数据库的影响。
猜你喜欢
  • 1970-01-01
  • 2016-07-23
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多