gpt4 book ai didi

ruby-on-rails - rails : Self referential parent/child hierarchy without through table

转载 作者:行者123 更新时间:2023-12-04 21:35:18 28 4
gpt4 key购买 nike

我有一个带有 parent_id 的事件模型和 date属性:

事件.rb

has_many :children, :class_name => "Event"
belongs_to :parent, :class_name => "Event"

我调用 event.parent 没有问题或 event.children .子事件本身永远不会有子事件。

我正在尝试为此模型添加一个范围,以便我可以为每个 parent 返回最近的 future 日期的 child 。就像是:
scope :future, -> {
where("date > ?", Date.today)
}

scope :closest, -> {
group('"parent_id"').having('date = MAX(date)')
}

Event.future.closest ==> returns the closest child event from every parent

但以上 :closest范围为每个 parent 返回一个以上的 child 。

最佳答案

暂时忽略 Rails,您在 SQL 中所做的是 问题。这里是 lots of solutions .我会选择DISTINCT ONLEFT OUTER JOIN LATERAL .这是它在 Rails 中的样子:

scope :closest, -> {
select("DISTINCT ON (parent_id) events.*").
order("parent_id, date ASC")
}

这会给你 子对象 . (您可能还需要一个条件来排除没有 parent_id 的行。)从您自己的解决方案中,听起来这就是您想要的。如果你想要 父对象 ,带有可选的附加子对象,然后使用横向连接。不过,将其转换为 ActiveRecord 有点棘手。如果可以在两个查询中执行此操作,那么它看起来应该可以工作(坚持使用 DISTINCT ON ):
has_one :closest_child, -> {
select("DISTINCT ON (parent_id) events.*").
order("parent_id, date ASC")
}, class_name: Event, foreign_key: "parent_id"

然后你可以说 Event.includes(:closest_child) .同样,您可能希望过滤掉所有非 parent 。

关于ruby-on-rails - rails : Self referential parent/child hierarchy without through table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39781069/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com