Rails - 根据时间范围创建或更新

时间:2014-05-08 10:54:04

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

我有一个表格,我需要创建一个新条目或更新,如果其中一列在一系列日期(今天)内。

例如,我有一张班车登记表[姓名,时间],其中名字代表某人,时间是他想乘坐班车的时间。 每个(姓名)最多可以每天注册一次。

当有人注册时,我想更新现有的行(当天),如果存在,或者创建一个新行。

以下查询提取相关行(如果存在):

Shuttle.where('name= ? AND time BETWEEN ? AND ?', params[:name], DateTime.now.beginning_of_day, DateTime.now.end_of_day)

尝试使用first_or_create和等价物但无法找到正确的语法来应用范围查询。

有什么想法吗?

由于

4 个答案:

答案 0 :(得分:2)

first_or_create在这种情况下不适用,因为条件作为更新的值没有意义。这就像说"找到一个班车,在这一天的任何时间,如果你找不到一个,那么在这个特定的日子里随时创建一个时间"。这没有意义:当你创建一个班车时,你需要一个特定的时间。

你需要考虑你想要做的事情的逻辑:至少对我来说这并不明显。

答案 1 :(得分:2)

试试这个:

 Shuttle.where(:name => params[:name]).
         where(:time => DateTime.now.beginning_of_day..DateTime.now.end_of_day)).
         first_or_create(:time => DateTime.now)

参考:http://guides.rubyonrails.org/v3.2.13/active_record_querying.html#first_or_create

答案 2 :(得分:1)

如果我理解你,我会做以下

@shuttle = Shuttle.where('name= ? AND time BETWEEN ? AND ?', params[:name], DateTime.now.beginning_of_day, DateTime.now.end_of_day).first
@shuttle.columnname = "new value"
@shuttle.save

如果您正在进行多次

@shuttles = Shuttle.where('name= ? AND time BETWEEN ? AND ?', params[:name], DateTime.now.beginning_of_day, DateTime.now.end_of_day)
@shuttles.each do |shuttle|
  shuttle.columnname = "new value"
  shuttle.save
end

答案 3 :(得分:1)

这样的事情怎么样?

@shuttle = Shuttle.where(
      name: params[:name],
      time: DateTime.now.beginning_of_day..DateTime.now.end_of_day
    ).first_or_initialize do |s|
  s.attribute = value
  s.save
end