我有一个表格,我需要创建一个新条目或更新,如果其中一列在一系列日期(今天)内。
例如,我有一张班车登记表[姓名,时间],其中名字代表某人,时间是他想乘坐班车的时间。 每个(姓名)最多可以每天注册一次。
当有人注册时,我想更新现有的行(当天),如果存在,或者创建一个新行。
以下查询提取相关行(如果存在):
Shuttle.where('name= ? AND time BETWEEN ? AND ?', params[:name], DateTime.now.beginning_of_day, DateTime.now.end_of_day)
尝试使用first_or_create
和等价物但无法找到正确的语法来应用范围查询。
有什么想法吗?
由于
答案 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