ruby on rails多参数属性*如何*工作(datetime_select)

Dea*_*ler 17 validation datetime ruby-on-rails multiparameter

我相信那datetime_select是黑魔法.我真正想弄清楚是整个1i,2i,3i,4i...多个参数的东西.具体如何在后端处理(activerecord,还有其他什么?).订单号码后面的'i'是什么?它是一个类型说明符吗?如果是这样,还有哪些其他类型?我已经阅读了date_helper.rb的来源,它非常不透明.

这是我的动机:

我的:datetime模型中有一个列,我想通过两个text_fields 在视图中输入:一个用于日期,一个用于时间.它们需要经过验证,合并在一起,然后存储到datetime列中.最终我将使用javascript日历在日期字段中输入日期.

有没有人这样做过?我尝试使用虚拟属性(除了基本的railscast之外令人难以置信的未记录),问题是当创建一个新的activerecord对象并且具有nil属性时,虚拟属性失败(strftimenil类的未定义方法,这是有道理的).

有人有任何建议或最佳做法吗?谢谢!

Mar*_*ric 17

我有同样的问题.这是我发现的......

http://apidock.com/rails/ActiveRecord/Base/assign_multiparameter_attributes

assign_multiparameter_attributes(pairs)private

为需要多个构造函数参数的所有属性类实例化对象.这是通过使用这些参数在列类型或聚合类型(通过composed_of)对象上调用new来完成的.因此,将对写为write_on(1)="2004",writ_on(2)="6",written_on(3)="24",将使用Date.new("2004","6"实例化write_on(日期类型) ","24").您还可以在括号中指定类型转换字符,以便在构造函数中使用之前对参数进行类型转换.使用i作为Fixnum,f用于Float,s用于String,用于数组.如果给定属性的所有值都为空,则该属性将设置为nil.

因此,数字用于列所属数据类型的参数."i"是将其转换为整数.支持其他类型,如"f"表示浮动等.

您可以在execute_callstack_for_multiparameter_attributes中看到它检测到目标类型并实例化它并传递值.

因此,为了尝试直接回答提出的问题,我认为你不能用它来覆盖DateTime的创建方式,因为它使用的构造函数不支持你想要传入的格式.我的解决方法是将DateTime列拆分为一个Date和一个Time列.用户界面可以按我想要的方式工作.

我想知道是否有可能在类上创建属性访问器,分别代表日期和时间,但保留一个DateTime列.然后表单可以引用那些单独的访问器.这可能是可行的.另一种选择可能是使用composed_of进一步自定义类型.

希望能帮助别人.:)