您如何在ActiveRecord关系中表示此SQL查询?

时间:2009-07-13 00:37:08

标签: ruby-on-rails activerecord calendar

我有一个稍微复杂的查询,我希望将其作为一个自然的ActiveRecord关系。目前我调用@ calendar.events和@ calendar.shared_events然后加入数组并对它们进行排序。可以使用此sql进行合并:

SELECT calendar_events.* FROM calendar_events left outer join calendar_events_calendars on calendar_events_calendars.calendar_event_id = calendar_events.id where calendar_events.calendar_id = 2 or calendar_events_calendars.calendar_id = 2

但我不确定如何将其表示为ActiveRecord关系。我知道我可以使用自定义的sql finder,但我希望能够在结果上使用范围。

目前,某个活动属于一个日历,并且还通过habtm联接表属于许多其他日历:

  has_and_belongs_to_many :shared_events, :class_name => 'CalendarEvent', :order => 'beginning DESC, name'
  has_many :events, :class_name => 'CalendarEvent', :dependent => :destroy, :order => 'beginning DESC, name'

任何指针都将非常感激:)

1 个答案:

答案 0 :(得分:0)

您能帮我们更多地了解您的数据结构吗?你想通过HABTM或has_many,通过两种关系(has_many / belongs_to和HABTM)来实现什么?在我看来,简化您的数据模型可能会产生您所追求的结果。 (对不起 - 没有足够的分数或者会添加评论)

- 评论后更新

我认为您在评论中提出的建议是一个无限更好的解决方案。 可能会如何开始实现它,但它不必要地复杂 - 根据我的经验,当你开始拥有ActiveRecord时,你经常可以告诉你何时走错了路径疯狂的复杂和重复的关系名称。

为什么不呢 a)通过关系(在两个方向上)拥有一切 b)在连接表上有一个附加字段,以指定这是主/主附件(反之亦然)。

然后,您可以在事件模型上为共享事件等命名范围,通过在指定连接上包含条件来实现魔术。这给你:

@calendar.events #returns all events across the join
@calendar.shared_events #where the 'shared' flag on the join is set
@calendar.main_events #without the flag