Store message receivers in a new table instead of in a serializied value
This commit is contained in:
parent
1cb7f888b7
commit
f8148e7d30
7 changed files with 96 additions and 35 deletions
|
|
@ -0,0 +1,51 @@
|
|||
class CreateMessageRecipients < ActiveRecord::Migration
|
||||
class Message < ActiveRecord::Base
|
||||
has_many :message_recipients
|
||||
end
|
||||
|
||||
class MessageRecipient < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def up
|
||||
create_table :message_recipients do |t|
|
||||
t.references :message, index: true, null: false
|
||||
t.references :user, null: false
|
||||
t.integer :email_state, default: 0, null: false
|
||||
t.datetime :read_at
|
||||
end
|
||||
|
||||
add_index :message_recipients, [:user_id, :read_at]
|
||||
|
||||
Message.all.each do |m|
|
||||
recipients = YAML.load(m.recipients_ids).map do |r|
|
||||
{
|
||||
message_id: m.id,
|
||||
user_id: r,
|
||||
email_state: m.email_state
|
||||
}
|
||||
end
|
||||
MessageRecipient.create! recipients
|
||||
end
|
||||
|
||||
change_table :messages do |t|
|
||||
t.remove :recipients_ids
|
||||
t.remove :email_state
|
||||
end
|
||||
end
|
||||
|
||||
def down
|
||||
change_table :messages do |t|
|
||||
t.text :recipients_ids
|
||||
t.integer :email_state, default: 0, null: false
|
||||
end
|
||||
|
||||
messages = Message.all.includes(:message_recipients).map do |m|
|
||||
recipients = m.message_recipients.map(&:user_id)
|
||||
m.recipients_ids = recipients.to_yaml
|
||||
m.email_state = m.email_state
|
||||
m.save!
|
||||
end
|
||||
|
||||
drop_table :message_recipients
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue