大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 在Rails模型中设置和获取虚拟属性,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Event模型中的两个日期时间属性:
start_at: datetiR_803_11845@e end_at: datetiR_803_11845@e
我想使用3个字段以表格形式访问它们:
event_date start_time end_time
我遇到的问题是如何将实际和虚拟属性保持在“同步”,以便可以通过表单和/或直接通过start_at&更新模型. end_at.
class Event < ActiveRecord::Base attr_accessible :end_at,:start_at,:start_time,:end_time,:event_date attr_accessor :start_time,:event_date after_initialize :get_datetiR_803_11845@es # convert db format into accessors before_validation :set_datetiR_803_11845@es # convert accessors into db format def get_datetiR_803_11845@es if start_at && end_at self.event_date ||= start_at.to_date.to_s(:db) # yyyy-mm-dd self.start_time ||= "#{'%02d' % start_at.hour}:#{'%02d' % start_at.min}" self.end_time ||= "#{'%02d' % end_at.hour}:#{'%02d' % end_at.min}" end end def set_datetiR_803_11845@es self.start_at = "#{event_datE} #{start_timE}:00" self.end_at = "#{event_datE} #{end_timE}:00" end end
哪个有效:
1.9.3p194 :004 > e = Event.create(event_date: "2012-08-29",start_time: "18:00",end_time: "21:00") => #<Event id: 3,start_at: "2012-08-30 01:00:00",end_at: "2012-08-30 04:00:00",created_at: "2012-08-22 19:51:53",updated_at: "2012-08-22 19:51:53">
直到直接设置实际属性(end_at在验证时设置回end_timE):
1.9.3p194 :006 > e.end_at = "2012-08-30 06:00:00 UTC +00:00" => "2012-08-30 06:00:00 UTC +00:00" 1.9.3p194 :007 > e => #<Event id: 3,end_at: "2012-08-30 06:00:00",updated_at: "2012-08-22 19:51:53"> 1.9.3p194 :008 > e.save (0.1ms) BEGIN (0.4ms) updatE "events" SET "end_at" = '2012-08-30 04:00:00.000000',"start_at" = '2012-08-30 01:00:00.000000',"updated_at" = '2012-08-22 20:02:15.554913' WHERE "events"."id" = 3 (2.5ms) COMMIT => true 1.9.3p194 :009 > e => #<Event id: 3,updated_at: "2012-08-22 20:02:15"> 1.9.3p194 :010 >
我的假设是我还需要自定义“实际”属性的setter,但我不知道如何做到这一点w / out搞砸了默认行为.思考?也许有更多的“Rails-y”“回调-y”方式来处理这个问题?
class Event < ActiveRecord::Base attr_accessible :end_at,:event_date attr_accessor :start_time,:event_date def start_time @start_time || time_attr_from_datetiR_803_11845@e(start_at) end def start_time=(start_time_value) @start_time = start_time_value set_start_at end def end_time @end_time || time_attr_from_datetiR_803_11845@e(end_at) end def end_time=(end_time_value) @end_time = @end_time_value set_end_at end def event_date @event_date || start_at.to_date.to_s(:db) end def event_date=(event_date_value) @event_date = event_date_value set_start_at set_end_at end def start_at=(start_at_value) write_attribute(:start_at,start_at_value) # Maybe you need to do write_attribute(:start_at,datetiR_803_11845@e.parse(start_at_value)) here ??? @start_time = time_attr_from_datetiR_803_11845@e(start_at) end def end_at=(end_at_value) write_attribute(:end_at,end_at_value) # Maybe you need to do write_attribute(:end_at,datetiR_803_11845@e.parse(end_at_value)) here ??? @end_time = time_attr_from_datetiR_803_11845@e(end_at) end private def set_start_at self.start_at = datetiR_803_11845@e.parse("#{event_datE} #{start_timE}:00") end def set_end_at self.end_at = datetiR_803_11845@e.parse("#{event_datE} #{end_timE}:00") end def time_attr_from_datetiR_803_11845@e(datetiR_803_11845@E) "#{'%02d' % datetiR_803_11845@e.hour}:#{'%02d' % datetiR_803_11845@e.min}" end end
编辑:获取和设置start_time和end_time有一个明确的模式.它可以通过元编程进行抽象,但我认为这会使示例不清楚.
以上是大佬教程为你收集整理的ruby-on-rails – 在Rails模型中设置和获取虚拟属性全部内容,希望文章能够帮你解决ruby-on-rails – 在Rails模型中设置和获取虚拟属性所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。