1

我们目前在我们的项目中使用Mailboxer,它运行良好。

现在我们要添加RequestsConversations. 基本上,这个想法是添加一个

has_one :request, :foreign_key => 'request_id'

但我们无法访问conversation.rb,因为它属于 gem。

我们已经阅读了有关自定义 gem 的信息(此处此处),但提供的解决方案似乎并不好。

实现我们想要的最好的方法是什么?

我们可以吗:

  • 将 gem 模型扩展为我们可以编辑的自定义模型?
  • 有一种“干净”的方式来编辑 conversation.rb 吗?

谢谢

4

2 回答 2

3

这个问题已经有一年多了,但我想我会分享我在 Rails 4 环境中遇到的类似问题的解决方案。

本质上:

  1. 创建一个继承自模型的新子Mailboxer::Conversation模型
  2. 将关联添加到新的子模型。
  3. becomes创建关联时使用方法

为了说明,这是我的新模型文件,称为AppConversationMailboxer::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

然后,在我需要访问关联的代码中,我首先通过mailboxer gem 提供的API 获取mailboxer 的对话对象,然后使用ActiveRecordbecomes方法创建/修改/读取关联。例如:

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
于 2014-09-17T09:15:37.470 回答
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 之类的文件中,但 Rails 不会在我们调用Mailboxer::Conversation.

于 2015-02-26T07:51:56.843 回答