可选时间where子句

时间:2014-11-07 07:01:55

标签: ruby-on-rails ruby rails-activerecord

我有一个可选的时间where子句。

where('created_at < ?', params[:infinite_scroll_time_buffer])

这包含在一系列电话中。

我意识到where可以使用哈希值,如果哈希值为空,或者缺少任何属性,则不会包含它们。这听起来不错,因为我可以避免检查params[:infinite_scroll_time_buffer]是否存在,只需包含where子句并让Rails处理其余部分。

问题如下:

def action
  options = {}
  options[:created_at] = params[:infinite_scroll_time_buffer]

  Post.method.another_method.where(options).another_method
end

除了SQL查询检查post.created_at = ?而不是post.created_at < ?(理所当然地)之外,这样可行。

我可以有一段时间,但我不能为我的生活找到时间来引用所有时间的开头,或类似Time::THE_BEGINNING_OF_EVERYTHING_AS_WE_KNOW_IT_DUN_DUN_DUN

之类的东西

这样我就可以拥有从params[:infinite_scroll_time_buffer]开始的范围。还有另一种方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

post.rb 中创建一个范围:

scope :created_before, ->(time) { where('created_at < ?', time) }

现在:

def action
  options = {}
  Post.method.another_method.where(options).
      created_before(params[:infinite_scroll_time_buffer]).
      another_method
end

如果您没有params[:infinite_scroll_time_buffer],请不要首先进行查询:

def action
  options = {}
  # more operation on options hash here
  posts = Post.method.another_method.where(options)
  posts = posts.created_before(params[:infinite_scroll_time_buffer]) if params[:infinite_scroll_time_buffer].present?
  posts = posts.some_another_method
end