Rails - Mailboxer gem:向Conversation添加关系

时间:2013-07-22 08:57:07

标签: ruby-on-rails-3 gem relationship mailboxer

我们目前正在项目中使用Mailboxer并且它正常。

现在我们要将Requests添加到Conversations。基本上,这个想法是添加一个

has_one :request, :foreign_key => 'request_id'

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

我们已经阅读了有关自定义gem(herehere)的内容,但提供的解决方案似乎不太好。

实现我们想要的最佳方式是什么?

我们可以:

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

由于

2 个答案:

答案 0 :(得分:3)

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

本质:

  1. 创建一个继承自Mailboxer::Conversation模型
  2. 的新子模型
  3. 将关联添加到新子模型。
  4. 创建关联时使用becomes方法
  5. 为了说明,这是我的新模型文件,名为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不会自动加载此文件。