【问题标题】:How do I stored a date in my model?如何在模型中存储日期?
【发布时间】:2016-02-29 20:42:23
【问题描述】:

我使用的是 Rails 4.2.3 和 MySql 5.5.37。我有一个基于以下数据库表的模型……

mysql> desc user_objects;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id    | int(11)      | YES  | MUL | NULL    |                |
| object     | varchar(255) | YES  |     | NULL    |                |
| day        | date         | YES  |     | NULL    |                |
| total      | int(11)      | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

在我的控制器中,我正在尝试处理从表单提交的参数,所以我使用它......

def create
  @current_user = User.find(session["user_id"])
  …
  puts user_object_params
  @user_object = UserObject.new(user_object_params)
  puts @user_object.object 
  puts @user_object.day 
  puts @user_object.total

即使第一行“puts”打印出“{"object"=>"3", "day"=>"02/28/2016", "total"=>"77"}”,第三行puts 行 (“@user_object.day”) 什么也不打印。我需要做什么才能通过“new”调用在我的模型中创建我的日期对象?

编辑:这是文件“./app/models/user_object.rb”中user_object的定义。

class UserObject < ActiveRecord::Base

  validates :day, :presence => true
  validates_numericality_of :total
  validates :object, :presence => true

  def self.find_total_by_user_object_month_and_year(user_id, object, month, year)
    sum(:total, :conditions => ['user_id = ?', user_id, 'object = ?', object, 'month(day) = ?', month, 'year(day) = ?', year])
  end

  def self.find_total_by_user_object_and_year(user_id, object, year)
    sum(:total, :conditions => ['user_id = ?', user_id, 'object = ?', object, 'year(day) = ?', year])
  end

end

编辑 2:响应给出的答案,包括在我的控制器中

  puts user_object_params[:day] 
  @user_object.day = user_object_params[:day]
  puts @user_object.day

为第一个“puts”打印“02/23/2016”,但随后没有为第二个“puts”打印任何内容。

【问题讨论】:

  • @user_object.object@user_object.total 的值是否正确?
  • UserObject 的类定义是什么,它的职责是什么?那是某种形式的对象吗,或者它是什么?
  • 如果您在该列中成功保存了日期,那么您在此处所做的一切都应该有效。
  • 我包含了 UserObject 的类定义。它旨在镜像我包含的数据库表。不,我无法成功保存日期列 - 它保存为 null。
  • 如果您可以保存其他字段(不确定是否可以 - 这就是我问的原因),我想知道这是否是一个挑剔的 Ruby 日期格式问题。

标签: mysql ruby-on-rails date model


【解决方案1】:

打算打开一个答案,但预计它需要一些迭代。

假设 @user_object.object@user_object.total 行为正确(您需要确认这一点),我怀疑您遇到了棘手的 Ruby Date(或相关)问题。

确保 (a) @user_object.day 以您想要的格式定义(在您的迁移中)(您存储的是字符串、日期还是日期时间?)并且 (b) user_object_params[:day] 被格式化为与迁移中定义的类型相匹配的方式。

Ruby 和 Rails 如何处理 Dates 和 DateTimes 是众所周知的小细节(阅读,差异)。也许这是你问题的根源。

要将日期字符串转换为日期时间,您必须执行以下操作:

DateTime.strptime("06/18/2013", "%m/%d/%Y")

here 所述。因此,可能在执行@user_object.new(user_object_params) 之前,您可能需要执行以下操作:

user_object_params[:day] = DateTime.strptime(user_object_params[:day], "%m/%d/%Y")

在这里钓鱼,但认为它可能会有所帮助。

【讨论】:

  • 该列在我的迁移中被定义为:“t.date :day”。关于这一点,“user_object_params[:day] 的格式与迁移中定义的类型相匹配”,我不明白你的意思。你能举个例子吗,最好使用格式“%m/%d/%Y”?
  • 嗨,戴夫。我确实举了例子。请参阅上面的 strptime 行。你试过了吗?
【解决方案2】:

看起来您的参数是正确的,但是要检查问题是否出在 UserObject.new(user_object_params) 部分,您可以尝试单独分配值

@user_object = UserObject.new
@user_object.object = user_object_params[:object]
@user_object.day = user_object_params[:day]
@user_object.total = user_object_params[:total]

然后尝试打印这些值。

我感觉object 属性与某些rails 内部属性冲突。

要对此进行测试,您可以单独分配除对象 attr 之外的值。或删除哈希中的object 键。

【讨论】:

  • 尝试了你的建议,但仍然没有骰子。这行“@user_object.day = user_object_params[:day]”不保存提交内容的值。这与我的模型字段是日期这一事实有关,对吧?如何让 Rails 接受特定格式的提交日期?
  • 手动更改格式怎么样,比如user_object_params[:day].gsub('/','-')
  • 当然,我可以试一试,但这是 Rails 的方式吗?似乎 tehre 会是某个地方,我可以告诉 Rails 我的日期格式应该是什么。有这样的设置吗?
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2021-03-16
  • 2020-12-07
相关资源
最近更新 更多