时间戳属性为零

Timestamp attributes are nil

我有 2 个模型,MicrospostUser

class Micropost < ActiveRecord::Base
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
end

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  attr_accessor :remember_token, :activation_token, :reset_token
  before_save   :downcase_email
  before_create :create_activation_digest
  validates :name, presence: true, length: { maximum: 50 }
end

seed.rb :

User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar",
             admin: true,
             activated:    true,
             activated_at: Time.zone.now)
99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password,
               activated:    true,
               activated_at: Time.zone.now)  
end

# Microposts
users = User.order(:created_at).take(6)
50.times do
  content = Faker::Lorem.sentence(5)
  users.each { |user| user.microposts.create!(content: content) }
end

但是当我使用 Faker 创建 Microposts 时,created_atupdated_at 属性在 Rails 中是 nil 而不是在 posgresql 中安慰。这让我很困惑,我不知道如何解决。 此外,当我手动创建 post 时,created_at 属性不为零。有人可以告诉我发生了什么事吗?

2.1.5 :016 >   m = Micropost.create!(content: "hello", user_id: User.first.id)
  User Load (0.6ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
   (0.2ms)  BEGIN
  SQL (0.8ms)  INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at") VALUES (, , , ) RETURNING "id"  [["content", "hello"], ["user_id", 1], ["created_at", "2015-01-13 08:07:38.584269"], ["updated_at", "2015-01-13 08:07:38.584269"]]
   (9.6ms)  COMMIT
 => #<Micropost id: 301, content: "hello", user_id: 1, created_at: "2015-01-13 07:07:38", updated_at: "2015-01-13 07:07:38"> 
2.1.5 :017 > m.created_at
 => Tue, 13 Jan 2015 08:07:38 CET +01:00 

当然,在我的 Posgresql 控制台中,您可以看到 microposts 实际上有时间戳。

railsdays_development=# \d+ microposts
                                                         Table "public.microposts"
   Column   |            Type             |                        Modifiers                        | Storage  | Stats target | Description 
------------+-----------------------------+---------------------------------------------------------+----------+--------------+-------------
 id         | integer                     | not null default nextval('microposts_id_seq'::regclass) | plain    |              | 
 content    | text                        |                                                         | extended |              | 
 user_id    | integer                     |                                                         | plain    |              | 
 created_at | timestamp without time zone | not null                                                | plain    |              | 
 updated_at | timestamp without time zone | not null                                                | plain    |              | 
Indexes:
    "microposts_pkey" PRIMARY KEY, btree (id)
    "index_microposts_on_user_id" btree (user_id)
    "index_microposts_on_user_id_and_created_at" btree (user_id, created_at)
Has OIDs: no

railsdays_development=# select * from microposts;
 id  |                                      content                                      | user_id |         created_at         |         updated_at         
-----+-----------------------------------------------------------------------------------+---------+----------------------------+----------------------------
   1 | Velit optio magni in modi distinctio.                                             |       1 | 2015-01-13 06:48:48.212602 | 2015-01-13 06:48:48.212602
   2 | Velit optio magni in modi distinctio.                                             |       2 | 2015-01-13 06:48:48.216021 | 2015-01-13 06:48:48.216021
   3 | Velit optio magni in modi distinctio.                                             |       3 | 2015-01-13 06:48:48.218617 | 2015-01-13 06:48:48.218617
   4 | Velit optio magni in modi distinctio.                                             |       4 | 2015-01-13 06:48:48.221544 | 2015-01-13 06:48:48.221544
   5 | Velit optio magni in modi distinctio.                                             |       5 | 2015-01-13 06:48:48.223975 | 2015-01-13 06:48:48.223975
   6 | Velit optio magni in modi distinctio.                                             |       6 | 2015-01-13 06:48:48.226611 | 2015-01-13 06:48:48.226611
   7 | Magni aliquid ut enim sunt aut.                                                   |       1 | 2015-01-13 06:48:48.22897  | 2015-01-13 06:48:48.22897
   8 | Magni aliquid ut enim sunt aut.                                                   |       2 | 2015-01-13 06:48:48.23096  | 2015-01-13 06:48:48.23096
   9 | Magni aliquid ut enim sunt aut.                                                   |       3 | 2015-01-13 06:48:48.232889 | 2015-01-13 06:48:48.232889
  10 | Magni aliquid ut enim sunt aut.                                                   |       4 | 2015-01-13 06:4:
Faker 创建的

Micropost 有 nil 个时间戳。但是我自己创建的 Microposts 有一个有效的时间戳。

这来自 Faker 创建的微post(前 300 微post秒)

2.1.5 :021 > Micropost.count
   (0.6ms)  SELECT COUNT(*) FROM "microposts"
 => 301 
2.1.5 :022 > a = Micropost.find(2).created_at
  Micropost Load (0.6ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."id" =   ORDER BY "microposts"."created_at" DESC LIMIT 1  [["id", 2]]
 => nil 
2.1.5 :023 > 

_create_microposts.rb :

class CreateMicroposts < ActiveRecord::Migration
  def change
    create_table :microposts do |t|
      t.text :content
      t.references :user, index: true

      t.timestamps null: false
    end
    add_index :microposts, [:user_id, :created_at]
  end
end

在深入了解您的申请后,我发现您的 config/application.rb:

中有这一行

config.active_record.default_timezone = 'Warsaw'

如果您希望使用 UTC,

config.active_record.default_timezone 需要 :utc,如果您希望使用 config.time_zone 中的时区,则需要 :local。在本地,当我将其设置为 :local 时,我得到:

>> Micropost.first
  Micropost Load (1.0ms)  SELECT  "microposts".* FROM "microposts"  ORDER BY "microposts"."created_at" DESC LIMIT 1
=> #<Micropost id: 300, content: "Nemo fuga eveniet expedita consequatur.", user_id: 6, created_at: "2015-01-19 22:21:48", updated_at: "2015-01-19 22:21:48", picture: nil>

当设置为 :utc 时,我得到:

>> Micropost.first
  Micropost Load (0.6ms)  SELECT  "microposts".* FROM "microposts"  ORDER BY "microposts"."created_at" DESC LIMIT 1
=> #<Micropost id: 300, content: "Nemo fuga eveniet expedita consequatur.", user_id: 6, created_at: "2015-01-19 16:21:48", updated_at: "2015-01-19 16:21:48", picture: nil>

我自己可能会错过这个,但我去挖掘文档是因为配置 "just didn't look right™."

相关文档可以在section 3.6 of the Rails guide under Configuring Active Record.

中找到