【问题标题】:Most recent has_one from a has_many来自 has_many 的最新 has_one
【发布时间】:2016-07-28 22:05:53
【问题描述】:

我有一个带有密钥(域)的公司模型。我有一个联系人模型,它也有一个域。

我已经成功地在这两者之间建立了一个 has_many 关系。

has_many :contacts, class_name: 'Contact', primary_key: 'domain', foreign_key: 'domain'

每个联系人都有一个date 字段。我想要一个关系,它可以让我从contacts 关系中获得最近的联系人(date)。

这可能吗?

我知道我可以这样做:

def most_recent_contact
  contacts.order('date desc null last').first
end

这是最好的方法吗?是 rails 方式吗?接受建议。

【问题讨论】:

  • 您的意思是 - 联系人关系中任何 x company 的最近联系人?
  • 是的。因此,对于给定的公司,联系人集将针对该公司(例如 xyz.com 上的所有联系人)。

标签: ruby-on-rails ruby ruby-on-rails-4 relationship has-many


【解决方案1】:

嗯,这似乎是一种方式,但它不会“重用”这种关系(它会重复它)......

has_many :contacts, class_name: 'Contact', primary_key: 'domain', foreign_key: 'domain'
has_one  :most_recent_contact, -> { order date:  :desc }, class_name: 'Contact', primary_key: 'domain', foreign_key: 'domain'

【讨论】:

  • 您的两种方法都足以获取此信息。我真的很喜欢这个!您生成的 db-query 将保持不变:)
  • 谢谢。我无法教它使用已经定义了类、主键和外键的 has_many,这让我很恼火。
  • 如果你在更复杂的查询中使用它,你可能会丢失 orderrng。
【解决方案2】:

Stephen Karger 以(恕我直言)最佳和可靠的解决方案加入 https://www.salsify.com/blog/engineering/most-recent-by-group-in-rails

简单地说:

  1. 创建范围 Contact.most_recent_by_domain(使用特定 SQL)
  2. 将该范围合并到has_one :most_recent_contact, -> { merge(Contact.most_recent_by_domain) }, class_name: 'Contact', primary_key: 'domain', foreign_key: 'domain'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2012-09-18
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多