2013-07-22 4 views
1

В настоящее время мы используем Mailboxer в нашем проекте, и все в порядке.Rails - почтовый ящик: добавление отношений к разговору

Теперь мы хотим добавить Requests в Conversations. В принципе, идея была бы добавить

has_one :request, :foreign_key => 'request_id' 

, но мы не можем получить доступ к conversation.rb, так как он относится к драгоценному камню.

Мы ознакомились с настройкой драгоценного камня (here и here), но предлагаемые решения выглядят не очень хорошо.

Что было бы лучшим способом добиться того, чего мы хотим?

Можем ли мы:

  • расширить модель гем к пользовательской, которую мы можем редактировать?
  • есть «чистый» способ редактирования chat.rb?

Благодаря

ответ

3

Этот вопрос является более года назад, но я думал, что я разделю мое решение подобной проблемы я имел в среде Rails 4.

По существу:

  1. Создать новую модель ребенка, который наследует от Mailboxer::Conversation модели
  2. Добавить ассоциации к новой модели ребенка.
  3. Используйте метод 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 

Затем, где бы ни находились в коде, который мне нужен для доступа к ассоциации, я сначала получаю объект разговора почтового ящика через 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 
+0

Ничего себе, так чисто! отличный ответ, спасибо –

0

мне очень нравится @richsinn подход (очень чистый, но вы должны помнить, называя becomes). Другим решением было бы использовать некоторое метапрограммирование, чтобы добавить некоторые методы непосредственно к классу Mailboxer::Conversation. Например. следующий код может быть добавлен к конфигурации/инициализаторам/mailboxer.rb:

Mailboxer.setup do |config| 
    [...] 
end 

Mailboxer::Conversation.class_eval do 
    belongs_to :request 
end 

В идеале, мы могли бы поставить этот код в нечто вроде приложения/модели/conversation.rb, но Rails не будет загружать этот файл автоматически при мы называем Mailboxer::Conversation.

Смежные вопросы