0

我的事件管理应用程序有一个 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 指南的“指定连接表的条件”部分下得到了这个“位置”代码:

活动记录查询接口

所以我的问题:

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

提前致谢!

4

1 回答 1

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

于 2013-07-11T15:46:55.283 回答