2013-07-26 2 views
0

При попытке обновить значение read_at от модели сообщений он не имеет такой эффект с помощью update_attributes функции.рельсы update_attributes не обновляет значение

Вот таблица сообщений

class CreateMessages < ActiveRecord::Migration 
    def change 
    create_table :messages do |t| 
     t.integer :sender_id, null: false 
     t.integer :receiver_id 
     t.string :subject 
     t.text :body 
     t.datetime :read_at 
     t.string :container, default: "draft" 
     t.boolean :sender_deleted, default: false 
     t.boolean :receiver_deleted, default: false 
     t.timestamps 
    end 
    end  
    def down 
    drop_table :messages 
    end 
end 

Вот сообщение Модель

class Message < ActiveRecord::Base 

    attr_accessible :subject, :body, :container, :sender_id, :receiver_id, :read_at 

    belongs_to :sender, 
     class_name: 'User' 

    belongs_to :receiver, 
     class_name: 'User' 

Вот Пользователь Модель

class User < ActiveRecord::Base 

has_many :messages_sent, 
    class_name: 'Message', 
    foreign_key: 'sender_id', 
    dependent: :destroy  

has_many :messages_received, 
    class_name: 'Message', 
    foreign_key: 'receiver_id', 
    dependent: :destroy 

Затем в терминале

user1 = User.create(name: "user1_name", email: "[email protected]", password: "foobar", password_confirmation: "foobar") 
user2 = User.create(name: "user2_name", email: "[email protected]", password: "foobar", password_confirmation: "foobar") 

msg1 = Message.create(sender_id: user1.id, receiver_id: user2.id, subject: 'subject_msg1', body: 'body_msg1') 
msg1.save 

@m = Message.find(msg1.id) 
@m.update_attributes(read_at: Time.now) 

Я получаю это выводит:

@m.read_at 
=>datestamped 

msg1.read_at 
=>nil 

Наверняка я что-то здесь отсутствует, но я не могу видеть, где после изменения и rechanging в has_many и belongs_to от ассоциаций, потому что я положил read_at по attr_accessible ПОМОЩЬ!

ответ

3

Вы должны запустить msg1.reload перед тем msg1.read_at

или

msg1.reload.read_at 
+0

Несмотря на ** @ m ** и ** msg1 **, имеющие одинаковые ** id **, используя '@ m.update_attributes (read_at: Time.now)' будет обновлять ** read_at * * атрибут от ** @ m ** только. После выполнения 'msg1.reload' он обновит значение ** msg1.read_at **. Я не понимаю, почему?Над моей моделью сообщения, создающей функцию для обновления attr, не работает, если я не использую ** reload ** в сообщении, которое оно само. Можете ли вы объяснить, почему? Я работаю над другими attr, только на этом он не обновляет его самостоятельно – fejao

0

Непосредственно из документации.

Используйте attr_accessible для предотвращения массового присвоения (по пользователям) атрибутов, которые не должны редактироваться пользователем. Массовое присвоение используется в методах создания и обновления вашего стандартного контроллера.

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

class User < ActiveRecord::Base 
    attr_accessible :login, :password 
end 

Итак, выполнение следующего будет справедливо возвращать true, но не обновляет атрибут статуса.

Если вы хотите обновить атрибут статуса, вы должны назначить его отдельно.

@user.status = 'active' 
save 

или просто использовать update_attribute

1

Для того, чтобы обновить значения, вы должны использовать

@m.update_attributes(:read_at => Time.now) 

См documentation для получения более подробной информации