如何在Rails中查询带关联的模型?

时间:2013-07-11 15:35:20

标签: ruby-on-rails ruby-on-rails-3

我的事件管理应用程序有一个UserEvent类,用户事件可以有很多事件发生时间的事件日期:

class UserEvent < ActiveRecord::Base
  ...
  has_many :event_dates
  ...
end

EventDate类有一个user_event_date属性:

class EventDate < ActiveRecord::Base
  attr_accessible :user_event_date, :start_time, :end_time
  belongs_to :user_event, inverse_of: :event_dates
  ...
end

我有一个Search类,当执行搜索时,find_user_events方法会过滤用户事件,因此只保留user_event_date位于搜索对象user_event_date_from和user_event_date_to属性之间的用户事件。

class Search < ActiveRecord::Base
  attr_accessible :user_event_date_from, :user_event_date_to

  private 
    def find_user_events
      if user_event_date_from.present? || user_event_date_to.present?
        time_range = user_event_date_from..user_event_date_to
        user_events = UserEvent.joins(:event_dates).where(event_dates: {user_event_date: time_range}) 
    end
end

但是过滤器不起作用,返回所有记录。我在“指定连接表上的条件”部分的Rails指南中获得了这个“where”代码:

Active Record Query Interface

所以我的问题:

  • 如何让这个工作?
  • 如果user仅指定user_event_date_from(user_event_date_to将为nil),这将起作用,因为范围将从user_event_date_from到nil,或者我应该检测到并将范围设置为:user_event_date_from..user_event_date_from

提前致谢!

1 个答案:

答案 0 :(得分:0)

调试不应该太棘手..打开你的rails控制台并坚持使用

UserEvent.joins(:event_dates).where(event_dates: { user_event_date: 10.days.ago..DateTime.now })

..或更改日期,以便您知道将返回一些数据。检查数据是否正确。如果可以,那么你的问题就在其他地方。

至于您的其他问题,如果您尝试在某个范围内使用nil,则会获得ArgumentError: bad value for range。所以,是的,取决于你希望它的行为方式,通常的解决方案是检查nil值并用适合你想要实现的行为的东西替换它。

编辑 - 奇怪的是,nil..nil作为范围不会产生ArgumentError,这可能意味着您没有成功设置值。您如何设置user_event_date_fromuser_event_date_to的值?