我们目前正在项目中使用Mailboxer并且它正常。
现在我们要将Requests
添加到Conversations
。基本上,这个想法是添加一个
has_one :request, :foreign_key => 'request_id'
但我们无法访问conversation.rb
,因为它属于gem。
我们已经阅读了有关自定义gem(here和here)的内容,但提供的解决方案似乎不太好。
实现我们想要的最佳方式是什么?
我们可以:
由于
答案 0 :(得分:3)
这个问题已经过了一年多了,但我想我会分享我在Rails 4环境中遇到的类似问题的解决方案。
本质:
Mailboxer::Conversation
模型becomes
方法为了说明,这是我的新模型文件,名为AppConversation
,继承自Mailboxer::Conversation
类:
class AppConversation < Mailboxer::Conversation
has_one :request, inverse_of: :app_conversation
end
Request
模型类中的相应关联:
class Request < ActiveRecord::Base
belongs_to :app_conversation, inverse_of: :request
end
然后,在代码中我需要访问关联的任何地方,我首先通过邮箱gem提供的API获取邮箱的对话对象,然后使用ActiveRecord becomes
方法创建/修改/读取协会。例如:
def some_controller_action
# get a mailboxer conversation
@conversation = current_user.mailbox.conversations.find(params[:id])
# get the request object associated to the conversation
@request = @conversation.becomes(AppConversation).request
# create a new request association
new_request = Request.new
@conversation.becomes(AppConversation).request = new_request
end
答案 1 :(得分:0)
我非常喜欢@richsinn的方法(很干净,但你必须记住调用becomes
)。另一种解决方案是使用一些元编程将一些方法直接添加到Mailboxer::Conversation
类。例如。可以将以下代码添加到config / initializers / mailboxer.rb:
Mailboxer.setup do |config|
[...]
end
Mailboxer::Conversation.class_eval do
belongs_to :request
end
理想情况下,我们可以将此代码放在app / models / conversation.rb之类的内容中,但是当我们调用Mailboxer::Conversation
时,Rails不会自动加载此文件。