最終的に、Mailboxer gem をカスタマイズして、conversationable
オブジェクトを会話に追加できるようにしました。
のmodels/mailboxer/conversation.rb
belongs_to :conversationable, polymorphic: true
移行を追加して、ポリモーフィックな関連付けを機能させます。
add_column :mailboxer_conversations, :conversationable_id, :integer
add_column :mailboxer_conversations, :conversationable_type, :string
のパラメータにをlib/mailboxer/models/messageable.rb
追加します。conversationable_object
send_message
def send_message(recipients, msg_body, subject, sanitize_text=true, attachment=nil, message_timestamp = Time.now, conversationable_object=nil)
convo = Mailboxer::ConversationBuilder.new({
:subject => subject,
:conversationable => conversationable_object,
:created_at => message_timestamp,
:updated_at => message_timestamp
}).build
message = Mailboxer::MessageBuilder.new({
:sender => self,
:conversation => convo,
:recipients => recipients,
:body => msg_body,
:subject => subject,
:attachment => attachment,
:created_at => message_timestamp,
:updated_at => message_timestamp
}).build
message.deliver false, sanitize_text
end
次に、オブジェクトに関する会話を行うことができます。
class Pizza < ActiveRecord::Base
has_many :conversations, as: :conversationable, class_name: "::Mailboxer::Conversation"
...
end
class Photo < ActiveRecord::Base
has_many :conversations, as: :conversationable, class_name: "::Mailboxer::Conversation"
...
end
何人かのユーザーが互いにメッセージを送るように設定されていると仮定します
bob = User.find(1)
joe = User.find(2)
pizza = Pizza.create(:name => "Bacon and Garlic")
bob.send_message(joe, "My Favorite", "Let's eat this", true, nil, Time.now, pizza)
メッセージ ビュー内で、オブジェクトを参照できます。
Pizza Name: <%= @message.conversation.conversationable.name %>