2015-01-13 15 views
5

mam 2 modele, Microspost i User:atrybuty Timestamp są zerowe

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: "[email protected]", 
      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 

Ale kiedy użyłem faker stworzyć Microposts, że created_at i updated_at atrybuty są nil w Rails ale NIE w konsoli posgresql. To mnie zdezorientowało i nie wiem, jak to naprawić. Co więcej, gdy ręcznie utworzę wpis, atrybut created_at nie jest zerowy. Czy ktoś może mi powiedzieć, co się dzieje?

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 ($1, $2, $3, $4) 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 

Oczywiście w mojej konsoli Posgresql widać, że mikroposty mają znaczniki czasu.

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: 

Mikropost stworzony przez Fakera ma znaczniki czasu nil. Ale Microposts, które sam tworzę, mają ważny znacznik czasu.

To z micropost stworzonej przez Faker (pierwsze 300 microposts)

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" = $1 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 
+0

Czy możesz mi pokazać, gdzie jest coraz created_at zero? – Ajay

+0

'2.1.5: 021> Micropost.count (0.6ms) WYBIERZ LICZBĘ (*) Z" mikropostów " => 301 2.1.5: 022> a = Mikropost.find (2) .całkitk. Ładunek mikropostu (0,6ms) WYBIERZ "microposts". * Z "microposts" GDZIE "microposts". "Id" = 1 $ ORDER BY "microposts". "Created_at" DESC LIMIT 1 [["id", 2]] => zero 2.1 .5: 023> "@Ajay – Emanuel

+0

wklej plik migracji, proszę o XXXX_create_microposts.rb? – Ajay

Odpowiedz

6

Po wykopaniu przez aplikacji, Odkryłam, że masz ten wiersz w config/application.rb:

config.active_record.default_timezone = 'Warsaw'

config.active_record.default_timezone spodziewa się albo :utc, jeśli chcesz użyć UTC lub :local, jeśli spodziewasz się użyć strefy czasowej znalezionej w config.time_zone. Lokalnie, kiedy ustawić to :local, otrzymuję:

>> 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> 

Przy ustawieniu :utc, otrzymuję:

>> 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> 

pewnie byłoby przegapić ten sam, ale poszedłem kopania docs ponieważ konfiguracja "po prostu nie wyglądała dobrze ™".

Stosowna dokumentacja można znaleźć w section 3.6 of the Rails guide under Configuring Active Record.

Powiązane problemy