Ruby on Rails - 在':include =>'上添加条件以加载有限数量的对象

par*_*zan 6 ruby ruby-on-rails

我有两个模型User和Event.基数是一个用户有很多事件.当我查询数据库以向我提供所有用户及其相应的事件时,它返回正确的结果.示例语句:Users.find(:all,:include => [:events])

但是,我需要帮助的是根据条件为用户获取事件.我需要为每个返回的用户提供仅计划今天安排的事件(例如:CREATED_DATE = TODAY).也就是说,我不希望所有与用户相关的事件.说,我仍然需要在数据库中找到所有用户,但是对于那些今天没有安排事件的用户,他们不应该在哈希映射中加载事件.

有人可以帮我修改"Users.find(:all,:include => [:events])"Rails语句,这样我只能获得用户的某些事件,而不是所有事件?

谢谢,S

idl*_*ers 6

这些方面的东西应该有效:

# Rails 3
User.includes(:events).where(:events => {:created_at => Time.now.midnight..Time.now.tomorrow.midnight})

# Rails 2
User.find(:all, :includes => :events, :conditions => ["events.created_at between ? and ?", Time.now.midnight, Time.now.tomorrow.midnight])
Run Code Online (Sandbox Code Playgroud)

Time.now.tomorrow.midnight很讨厌.1.day.from_now.midnight可能会稍微不那么讨厌,取决于您的偏好;)

  • 感谢idlefingers的建议,但我不认为它会根据我想要做的工作.查询不会返回没有事件的用户,而只返回那些没有事件的用户.对于我的问题,我想要所有用户,但有些人也会有活动(如果他们的活动安排在今天). (3认同)

ave*_*ell 1

据我所知,您不能按照您描述的方式使用 :include 选项。

无论如何,获取所有事件有什么问题吗?无论如何,您都必须加载/加入/查询事件表。但是,如果实例化所有事件,您将需要更多内存。

当然,您可以执行两次查询,一项针对具有“今天”事件的用户,另一项针对没有“今天”事件的用户。

你也可以反过来:

Event.find(:all, :conditions => "...only today...", :include => :user)
Run Code Online (Sandbox Code Playgroud)

这将为您提供今天的所有事件(包括用户)。您可以使用另一个查询来获取所有用户而不包括事件,并在内存中执行其余操作。

  • 我正在使用用户对象,如何反转对象以便事件包含在用户中,而不是如上述语句中建议的包含用户的事件?如果我可以轻松地(需要较少的处理)做到这一点,那么这个解决方案可能会起作用。:) (2认同)