我正在构建一个电子商务应用程序,并希望实现类似消息传递系统的东西。在应用程序中,所有对话都将与Product
模型或Order
模型相关。在这种情况下,我想将相关对象(我想是类型 + id)存储到Conversation
对象中。
要添加字段,我当然可以生成并运行迁移,但是,由于模型和控制器都包含在 gem 中,我该如何声明关系?( belongs_to :linking_object, :polymorphic
) 和控制器?任何想法?
谢谢你。
我正在构建一个电子商务应用程序,并希望实现类似消息传递系统的东西。在应用程序中,所有对话都将与Product
模型或Order
模型相关。在这种情况下,我想将相关对象(我想是类型 + id)存储到Conversation
对象中。
要添加字段,我当然可以生成并运行迁移,但是,由于模型和控制器都包含在 gem 中,我该如何声明关系?( belongs_to :linking_object, :polymorphic
) 和控制器?任何想法?
谢谢你。
我最终定制了 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 %>
虽然重写自定义对话系统将是提供自定义要求的最佳长期解决方案(例如与其他模型链接),但在我已经实现与ConversationLink
模型的链接时节省一些时间。我希望它对将来在我这个职位上的任何人都有用。
模型:conversation_link.rb
class ConversationLink < ActiveRecord::Base
belongs_to :conversation
belongs_to :linkingObject, polymorphic: true
end
然后在我要链接的每个模型中conversation
,我只需添加:
has_many :conversation_link, as: :linkingObject
这将只允许您从链接对象获取相关对话,但反向链接的编码可以通过模块中定义的函数完成。
这不是一个完美的解决方案,但至少我不需要修补 gem ......
gem 会自动为您解决这个问题,因为他们已经构建了一个解决方案,您自己的域逻辑中的任何模型都可以充当消息对象。
简单地声明
acts_as_messagable
在您的订单或产品模型中将完成您正在寻找的内容。
你可以使用类似的东西:
form_helper :products
并将这些字段添加到消息表单
但邮箱附带附件功能(载波)包括
如果您需要邮件中的附件之类的内容,这可能会有所帮助: