Ruby on rails 如何从儿童记录集合中获取曾祖父母记录集合?

Ruby on rails 如何从儿童记录集合中获取曾祖父母记录集合?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,问题是: 我有一系列的记录:收据。我希望以高效的方式获得与这些接收对象关联的项目的唯一列表。对于这种特殊类型的问题,我找不到类似的问题/解决方案 这就是我想要的: @projects = @receipts.getUniqueProjects() 可能吗 以下内容看起来很有希望:但我如何访问祖父母记录?没有迭代子记录并导致巨大的数据库开销 receive.joins(消息:[对话::项目]) 任何指点都将不胜感激 以下是我使用的: 谢谢Vasilisa-感谢您预见到这是一个XY问题。您可以

问题是:

  • 我有一系列的记录:收据。我希望以高效的方式获得与这些接收对象关联的项目的唯一列表。对于这种特殊类型的问题,我找不到类似的问题/解决方案
这就是我想要的:

@projects = @receipts.getUniqueProjects()
可能吗

以下内容看起来很有希望:但我如何访问祖父母记录?没有迭代子记录并导致巨大的数据库开销

receive.joins(消息:[对话::项目])

任何指点都将不胜感激

以下是我使用的:
谢谢Vasilisa-感谢您预见到这是一个XY问题。

您可以使用
has\u many:通过关联,通过嵌套的
has\u many关联设置“快捷方式”非常有用

# Project.rb

  has_many :conversations
  has_many :messages, through: :conversations
  has_many :receipts, through: :messages

# Conversation.rb

  has_many :messages
  belongs_to :project

# Message.rb

  has_many :receipts
  belongs_to :conversation

# Receipt.rb

  belongs_to :message
在这种情况下,您可以轻松地加入它们,并使用
distinct
仅获取uniq项目

Project.joins(:receipts).distinct.where(receipts: { id: [1, 2, 3] })
乐意帮忙:)注意,
uniq
distinct
之间有区别。第一个方法在生成的AR关系中找到uniq对象并将其转换为数组,这意味着在
uniq
之后不能使用任何AR方法。但是第二种方法在sql级别使用
selectdistinct
,工作速度更快,因为它只选择uniq对象,而且仍然返回AR关系
# Project.rb

  has_many :conversations
  has_many :messages, through: :conversations
  has_many :receipts, through: :messages

# Conversation.rb

  has_many :messages
  belongs_to :project

# Message.rb

  has_many :receipts
  belongs_to :conversation

# Receipt.rb

  belongs_to :message
Project.joins(:receipts).distinct.where(receipts: { id: [1, 2, 3] })