【问题标题】:Is there a way to accept a parameter with a different type than in DB?有没有办法接受与 DB 不同类型的参数?
【发布时间】:2015-07-30 00:08:04
【问题描述】:

对于作为 API 的项目,我希望能够创建具有开始和结束日期的“事件”。

发送诸如“2015 年 5 月 18 日星期一 12:56:10 UTC +00:00”之类的日期时间并不容易,而且在前端应用程序中解析是一场噩梦。

我想要实现的是允许我的用户发送时间戳,并将其转换为数据库中的日期时间。

但是,如果我的字段被声明为在 DB 中有 Datetime,当我尝试创建一个带有时间戳的新行时,它不起作用并为这些字段返回 nil。

Event.create(start_at: Time.now.to_i, end_at: Time.now.to_i)

#<Event:0x007ff02424c838
  id: nil,
  start_at: nil,
  end_at: nil>

到目前为止,我想要这个:

before_validation :start_end_to_date

def start_end_to_date
    self.start_at = Time.at(self.start_date).to_time
    self.end_at = Time.at(self.end_date).to_time
end

在这种情况下,我的用户发送 start_date 参数,我将其转换为 Datetime

你能帮帮我吗?

【问题讨论】:

  • Convert to/from DateTime and Time in Ruby 的可能副本。在提出新问题之前,您应该真正搜索您的问题。
  • @Micah 我的问题不在于如何将“时间戳”转换为“日期时间”。但是在创建新行时,activerecord 字段如何接受时间戳。
  • 不需要。数据库在大多数情况下是类型安全的,因为 activerecord 应该与数据库相关联,所以它通常也是类型安全的。我建议您转换时间对象以匹配数据库中的内容,而不是尝试在结构中存储错误的类型。
  • 我不会存储错误的类型。我希望我的用户能够向我发送时间戳,然后将其转换为我的数据库的正确数据类型。
  • 那么我做的重复标志就是你想要的。您想接收一个时间对象,并将其转换为日期时间。那篇文章告诉你该怎么做。

标签: ruby-on-rails


【解决方案1】:

没有看到您的数据库架构,我只是在这里猜测真正的问题,但我会尝试转换为日期时间而不是时间。

Time.at(Time.now.to_i).to_datetime

此外,您应该在 Event 模型中为 start_at 和 end_at 创建设置器,而不是使用 before_validation 过滤器。

def start_at=(val)
  write_attribute(:start_at, Time.at(val).to_datetime)
end

def end_at=(val)
  write_attribute(:end_at, Time.at(val).to_datetime)
end

【讨论】:

  • 您的解决方案正是我想要的。谢谢!
猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2023-03-21
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
相关资源
最近更新 更多