Скрытие меток времени Unix в устаревшей БД с помощью Rails - PullRequest
0 голосов
/ 11 февраля 2010

Я пишу приложение Ruby on Rails, используя устаревшую базу данных. Проблема у меня в том, что у меня есть столбец метки времени Unix в базе данных. Я пытаюсь сделать так, чтобы я мог написать строку типа "2010-10-10" и получить дату, когда я ее читаю.

def birthdate
  bdate = self[:birthdate]

  if bdate == 0
    ''
  else
    if bdate =~ $CetConfig.regexp.date_format.regexp
      bdate
    else
      Date.parse(Time.at(bdate).to_s)
    end
  end
end

def birthdate=(bdate)
  self[:birthdate]= Time.parse(bdate.to_s).to_i
end

Это методы доступа, которые я должен попытаться сделать, однако, когда данные переполняются в форме из-за ошибки или чего-то другого, в результате я получаю метку времени в текстовом поле вместо строки даты.

Вот форма. (element_block просто оборачивает элемент и метку в правильные теги для dl)

<% form_for @pc, :url => { :controller => 'core', :action => 'create'}  do |f| %>
  <%= f.error_messages  %>
  <dl>
    <%= element_block  f.label(:contract, 'Contract Year'), f.contract_year_select(:contract) %>
    <% f.fields_for :profile_program do |pp| %>
      <%= element_block pp.label(:program, 'Program'), pp.hsp_program_select(:program) %>
    <% end %>

    <%= element_block f.label(:passport_number, 'Passport Number'), f.text_field(:passport_number) %>
    <%= element_block f.label(:passport_country, "Country that issued the student's passport"), f.countries_select(:passport_country) %>
    <%= element_block f.label(:passport_expires, 'Passport Expiration Date'), f.text_field(:passport_expires, :class => 'datepicker') %>
    <%= element_block f.label(:last_name, 'Last Name (as on passport)'), f.text_field(:last_name) %>
    <%= element_block f.label(:first_name, 'First Name (as on passport)'), f.text_field(:first_name) %>
    <%= element_block f.label(:middle_name, 'Middle Name (as on passport)'), f.text_field(:middle_name) %>
    <%= element_block f.label(:other_names, 'Other Names'), f.text_field(:other_names) %>
    <%= element_block f.label(:residence_street_address, 'Street Address'), f.text_field(:residence_street_address) %>
    <%= element_block f.label(:residence_city, 'City'), f.text_field(:residence_city) %>
    <%= element_block f.label(:residence_province, 'Province'), f.text_field(:residence_province) %>
    <%= element_block f.label(:residence, 'Country'), f.countries_select(:residence) %>
    <%= element_block f.label(:residence_postal_code, 'Postal Code'), f.text_field(:residence_postal_code) %>
    <%= element_block f.label(:birthdate, 'Date of Birth'), f.text_field(:birthdate) %>
    <%= element_block f.label(:citizenship, 'Country of Citizenship'), f.countries_select(:citizenship) %>
    <%= element_block f.label(:birth_city, 'Birth City'), f.text_field(:birth_city) %>
    <%= element_block f.label(:nationality, 'Nationality'), f.countries_select(:nationality) %>
    <%= element_block f.label(:gender, 'Gender'), f.gender_select(:gender) %>
    <%= element_block f.label(:email, 'Email'), f.text_field(:email) %>
    <%= element_block f.label(:desires_esl, 'Does the student wish to participate in CLEP?'), f.bool_yes_no_select(:desires_esl) %>
    <%= element_block f.label(:may_pay_tuiton, 'Willing to pay tuition'), f.yes_no_select(:may_pay_tuition) %>
  </dl>
  <div class="submit"><%= submit_tag("Proceed to Step Two") %></div>

<% end %>

Вот мой помощник

module ApplicationHelper
  def element_block label, element, example = ''
    example = '<br>' + example unless example.empty?
    "<dt>#{label}</dt><dd>#{element}#{example}</dd>"
  end
end

Обновление Я также попробовал следующее с тем же результатом.

def birthdate
  Time.at(read_attribute(:birthdate)).to_date
end

def birthdate=(bdate)
  write_attribute(:birthdate, bdate.to_time.to_i)
end

Я использую Rails 2.3.5

Ответы [ 2 ]

0 голосов
/ 03 марта 2010

В итоге я создал ложное поле в модели, которое является датой, и использовал фильтр after_validation для преобразования его в реальное поле. В модели

after_validation :write_birthdate

def write_birthdate
  bd = self.birthday
  unless bd.nil?
    write_attribute(:birthdate, Time.parse(bd).to_i)
  end
end

...

def birthday
  bd = read_attribute :birthday
  if bd.nil?
    bd = read_attribute :birthdate
    return Date.parse(Time.at(bd).to_s).to_s unless bd.nil? or bd === 0
    return nil
  end
  return bd
end

def birthday=(bdate)
  write_attribute(:birthday, bdate)
end

alias :birthdate :birthday
alias :birthdate= :birthday=

Таким образом, я пишу день рождения в качестве даты, но дата рождения остается отметкой времени.

0 голосов
/ 11 февраля 2010

Прежде всего, вы не должны возвращать пустую строку, когда вы получаете ноль в качестве значения из базы данных:

>> Time.at(0)
=> Thu Jan 01 01:00:00 +0100 1970

Во-вторых, вы должны читать / писать, используя методы, предоставляемые ActiveRecord:

def birthdate
  Time.at(read_attribute(:birthdate)).to_date
end

def birthdate=(date)
  write_attribute(:birthdate, date.to_time.to_i)
end
...