3

私は e-com アプリケーションを構築しており、メッセージング システムのようなものを実装したいと考えています。アプリケーションでは、すべての会話がProductモデルまたはモデルのいずれかに関連付けられますOrder。その場合、関連するオブジェクト (type + id だと思います) をオブジェクトに格納したいと思いConversationます。

フィールドを追加するために、もちろん移行を生成して実行できますが、Model と Controller は gem に含まれているため、どうすれば関係を宣言できますか? ( belongs_to :linking_object, :polymorphic) とコントローラ? 何か案が?

ありがとうございました。

4

4 に答える 4

4

最終的に、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_objectsend_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 %>
于 2014-11-11T20:47:27.937 に答える
1

カスタム会話システムを書き直すことは、カスタマイズ要件 (たとえば、他のモデルとのリンクなど) を提供するための最良の長期的なソリューションになりますが、現時点では時間を節約するために、ConversationLinkモデルとのリンクを実装しています。将来、私の立場にある方の参考になれば幸いです。

モデル:conversation_link.rb

class ConversationLink < ActiveRecord::Base
  belongs_to :conversation
  belongs_to :linkingObject, polymorphic: true
end

次に、 とリンクする対象の各モデルでconversation、次を追加します。

has_many :conversation_link, as: :linkingObject

これにより、関連する会話をリンク オブジェクトから取得することしかできなくなりますが、逆方向リンクのコーディングは、モジュールで定義された関数を介して行うことができます。

これは完璧な解決策ではありませんが、少なくとも宝石にパッチを適用する必要はありません...

于 2014-08-31T19:21:59.837 に答える
0

次のようなものを使用できます。

form_helper :products

これらのフィールドをメッセージフォームに追加します

ただし、メールボックスにはアタッチメント機能(キャリアウェーブ)が含まれています

これは、メッセージに添付ファイルのようなものが必要な場合に役立ちます。

https://stackoverflow.com/a/12199364/1230075

于 2014-04-08T07:55:08.627 に答える
0

gem は自動的にこれを処理します。独自のドメイン ロジック内の任意のモデルがメッセージ可能なオブジェクトとして機能するソリューションを構築しているためです。

単純に宣言する

acts_as_messagable

ご注文または製品モデルでは、探しているものを実現します。

于 2014-04-07T14:10:44.540 に答える