【问题标题】:Complex ActiveRecord association definition复杂的 ActiveRecord 关联定义
【发布时间】:2010-07-27 13:55:49
【问题描述】:

您将如何使用 ActiveRecord 映射虚线关联?是否有任何 ActiveRecord 方式?我想要的是获得特定商品的所有独特促销活动。

以下是我认为但我不太喜欢的事情:

使用自定义查找器

class Item < ActiveRecord::Base
  has_many :promotions, :finder_sql => "SELECT..FROM promotions..purchase_option_id IN (...)"
end

肮脏、低效但红宝石般的方式

my_item.purchase_options.map(&:promotion).uniq

打破PurchaseOptionPromotion HABTM 关联并为Item创建一个新关联PromotedPurchaseOption

class Item < ActiveRecord::Base
  has_many :promoted_purchase_options
  has_many :promotions, :through => :promoted_purchase_options
end

其他想法

我认为使用命名范围或定义新的方法不是一个好主意 如果使用它们,这将不会简单地工作或执行低效的查询:

Item.first.promotions.count
Item.first.promotions.available
Promotion.first.items.all

【问题讨论】:

  • 顺便问一下,有没有一种方法可以定义自定义查找器而不是编写普通的 SQL?
  • 有 :select, :from 选项可以修改 AR 生成的默认 SQL
  • 为什么您认为使用 named_scopes 不是一个好主意?绝对没问题,有很大帮助!
  • @j,因为调用Item.promotions 将返回Items 的数组而不是Promotions
  • @knoopx:在这种情况下,我相信使用返回promotions 的方法会比使用named_scope 更好。但是 named_scopes 通常真的很有帮助!

标签: ruby-on-rails activerecord associations


【解决方案1】:

也许这个:

class Item < ActiveRecord::Base
  has_many :purchase_options
  has_many :promotions, :through => :purchase_options, :uniq => true
end

【讨论】:

  • 如果PurchaseOptionPromotion 关联的类型为has_onehas_manybelongs_to 将起作用,但不适用于has_and_belongs_to,请查看ER 图跨度>
  • 这是更好的组织方式。我和@fantactuka 一起讨论这个。
【解决方案2】:

我不知道您为什么反对命名范围或自定义方法。这些东西可以通过封装大量查询逻辑来帮助降低复杂性。尽可能避免在您的关系中使用自定义 finder_sql。

如果您使用已弃用的 has_and_belongs_to_many 关系方法,您可能应该将其切换为直接连接模型。 has_many ..., :through 方法可以让您更好地控制模型之间的链接,并且您可以直接更改连接模型的属性。

【讨论】:

  • 我不想要 named_scopes/methods,因为我将链接关联,AR 将无法生成正确的 SQL。弃用是什么意思?问题是我不需要“直接模型”,它只会增加复杂性。
  • 从技术上讲,它仍然受支持,但缺少 has_many ... :through 关系提供的许多功能,例如能够轻松更新连接上的属性。在支持 :through (Rails 1.2?)之前,这些是唯一的方法。我应该说“失宠”而不是严格弃用。
  • ActiveRecord 通常非常适合在链接关联时弄清楚您的意思,因此除非严格要求,否则它比滚动您自己的 SQL 更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多