Ruby on Rails 5.1.2 released

New version of Ruby on Rails framework has been released, bringing some new features
27 June 2017   835
Ruby

A dynamic, open source programming language, focused on simplicity and productivity
 

Ruby on Rails

Ruby on Rails (RoR) - a framework written in the Ruby programming language

Good news for RoR fans. New 5.1.2 version has been released.

Changelogs

List of changes for every gem:

  •  Action Pack:
    • driven_by now registers poltergeist and capybara-webkit
      If driver poltergeist or capybara-webkit is set for System Tests, driven_by will register the driver and set additional options passed via :options param.
  • Action View:
    • Fixed issues with scopes and engine on current_page? method.
    • Generate field ids in collection_check_boxes and collection_radio_buttons. This makes sure that the labels are linked up with the fields.
  • Active Model:
    • Fixed regression in numericality validator when comparing Decimal and Float input values with more scale than the schema.
  • Active Record:
    • Restore previous behavior of collection proxies: their values can have methods stubbed, and they respect extension modules applied by a default scope.
    • Loading model schema from database is now thread-safe.
  • Active Support:
    • Cache: Restore the options = nil argument for LocalStore#clear that was removed in 5.1.0. Restores compatibility with backends that take an options argument and use the local cache strategy.

Fix implicit coercion calculations with scalars and durations
Previously calculations where the scalar is first would be converted to a duration of seconds but this causes issues with dates being converted to times, e.g:

Time.zone = "Beijing"           # => Asia/Shanghai
date = Date.civil(2017, 5, 20)  # => Mon, 20 May 2017
2 * 1.day                       # => 172800 seconds
date + 2 * 1.day                # => Mon, 22 May 2017 00:00:00 CST +08:00

Now the ActiveSupport::Duration::Scalar calculation methods will try to maintain the part structure of the duration where possible, e.g:
 

Time.zone = "Beijing"           # => Asia/Shanghai
date = Date.civil(2017, 5, 20)  # => Mon, 20 May 2017
2 * 1.day                       # => 2 days
date + 2 * 1.day                # => Mon, 22 May 2017
  • Railties:
    • Add Windows support to rails secrets:edit.

View all changes list at GitHub.

SHA-256

Feel free to use this checksum in order to check version of your gem:

$ shasum -a 256 *-5.1.2.gem
27943a2642cd94478a88d4e239bb1467476d2acd10f0f588b220e05367163524  actioncable-5.1.2.gem
e62c4e1b09565e8188d405eac974db1cf31b552064fa9e15fac686556837909f  actionmailer-5.1.2.gem
b63833831efcfc5fce72deb5bfc14feb7bbe87dd065d8de5904db6dfbc115bca  actionpack-5.1.2.gem
82efdca96308476cb644d65bc9842167099ed1210ce3c8b626be9ebdcc8c311e  actionview-5.1.2.gem
d6f762971dfaa312d5f9262eb65eef1c16080cde4790e0e3fd29a0c9651659c4  activejob-5.1.2.gem
e5d8ae2826f733220dd29792bda5c57d7aa5f6bca036abc1a5fcd4632628f1ce  activemodel-5.1.2.gem
a3757003b09ac6926d18b32106927d341f906fdf71aa8fa2e3a8e8e0716548ce  activerecord-5.1.2.gem
0ecf4132689fc06c888c8a1d6678dc22ab972ff5abe797c4fc685582c9ce9d17  activesupport-5.1.2.gem
4ee8ea1a2760cafbd70fbc878fd0c4ad2fec105082719c818934b39fd4ff0e9b  rails-5.1.2.gem
db82fbd1dd000b9f5558bfa20c341ccf74ea43716f96e3839be5c219fffe78fc  railties-5.1.2.gem

 

DateTime, Timestamp, Time and Date in Rails

Learn about key differenece between DateTime, Timestamp, Time and Date in Rails
31 October 2017   606

The difference between different date/time formats in ActiveRecord have little to do with Rails and everything to do with whatever database you're using.

Using MySQL as an example (if for no other reason because it's most popular), you have DATEDATETIMETIME and TIMESTAMP column data types; just as you have CHARVARCHARFLOATand INTEGER.

So, main differences: DATE only stores a date, TIME only stores a time of day, while DATETIME stores both.

The difference between DATETIME and TIMESTAMP is a bit more subtle: DATETIME is formatted as YYYY-MM-DD HH:MM:SS. Valid ranges go from the year 1000 to the year 9999 and everything in between. While TIMESTAMP looks similar when you fetch it from the database, it's really a just a front for a unix timestamp. Its valid range goes from 1970 to 2038. The difference here, aside from the various built-in functions within the database engine, is storage space. Because DATETIMEstores every digit in the year, month day, hour, minute and second, it uses up a total of 8 bytes. As TIMESTAMP only stores the number of seconds since 1970-01-01, it uses 4 bytes.

You can read more about the differences between time formats in MySQL here.

In the end, it comes down to what you need your date/time column to do. Do you need to store dates and times before 1970 or after 2038? Use DATETIME. Do you need to worry about database size and you're within that timerange? Use TIMESTAMP. Do you only need to store a date? Use DATE. Do you only need to store a time? Use TIME.

Having said all of this, Rails actually makes some of these decisions for you. Both :timestamp and :datetime will default to DATETIME, while :date and :time corresponds to DATE and TIME, respectively.