将数据组合到1个模型属性

时间:2011-05-24 12:13:20

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个日历系统,用户可以在单独的text_field中输入事件的日期和时间。我将日期和时间存储在事件模型中的一个属性(开始)中我很难确定如何组合日期和时间输入并将其组合到begin属性中。

我最好通过虚拟属性(:date:time)来实现这一点,这样我就可以轻松地将我的表单映射到这些虚拟属性,而无需在控制器中执行某些操作。

非常感谢

4 个答案:

答案 0 :(得分:10)

您可以为日期和时间属性创建自己的访问器方法,如下所示:

def date
   datetime.to_date
end

def date=(d)
  original = datetime
  self.datetime = DateTime.new(d.year, d.month, d.day,
    original.hour, original.min, original.sec)
end

def time
   datetime.to_time
end

def time=(t)
  original = datetime
  self.datetime = DateTime.new(original.year, original.month, original.day,
    t.hour, t.min, t.sec)
end

答案 1 :(得分:1)

您应该使用before_validation callback将来自两个虚拟属性的数据合并为一个真实属性。例如,像这样:

before_validation(:on => :create) do
  self.begin = date + time
end

date + time将是两个值的组合逻辑。

然后你应该编写一些attr_accessor方法来获取必要的单个值。哪个会进行拆分并返回适当的值。

答案 2 :(得分:1)

我认为您的模型中有一个日期时间字段,rails允许您在表单中轻松地读取日期部分和时间部分(轻松),然后将它们轻松地组合到一个日期时间字段中。如果您的属性是日期时间,则此功能特别有用。

# model post.rb
attr_accessible :published_on # just added here to show you that it's accessible

# form
<%= form_for(@post) do |f| %>
  <%= f.date_select :published_on %>
  <%= f.time_select :published_on, :ignore_date => true %>
<% end %>

日期选择行将为您提供published_on的日期部分 时间选择行将为您提供published_on的时间部分。 :ignore_date =&gt; true将确保时间选择不输出与published_at相关的3个隐藏字段,因为您已在上一行中读取它们。

在服务器端,将合并日期和时间字段!

如果您正在以text_box的身份阅读日期,那么此解决方案不幸地无法正常工作。由于您没有使用rails为日期时间内置的rails提供的复合属性。

简而言之,如果您使用date_select,time_select,rails可以轻松实现,否则您可以自由寻找其他选项。

答案 3 :(得分:0)

您应该使用开源日期时间选择器窗口小部件来为您处理此问题,而不是将字段自己设置为文本字段。