Rails: родительский build_association в обратном вызове - PullRequest
2 голосов
/ 17 февраля 2011

Разработка системы пользовательских сообщений (да, я знаю ... еще одна из них).

У меня есть:

class Conversation << AR::Base
  has_many :messages
end

class Message << AR::Base
  belongs_to :conversation

  # this is what I want, create a conversation if one isn't assigned
  before_create :assign_to_conversation, :unless => :conversation

  def
    # but this won't save parent association
    build_conversation(:subject => subject, :starter => user)
  end
end

По сути, я хочу отслеживать сообщения как часть разговора. Если пользователь отправляет новое сообщение, оно должно стать частью нового разговора. Если сообщение является ответом на существующее сообщение, я просто хочу назначить сообщение этому конкретному разговору.

В messages_controller я хочу просто сделать

def create
  @message.save(params[:message]).
end

Без необходимости идти с

def create
    transaction do
      c = Conversation.build(...)
      c.messages.build(params[:message])
      c.save
    end
end

Я стараюсь, чтобы мои контроллеры были простыми, а также осуществляю беседы и создание сообщений в рамках одной транзакции.

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Кажется, я понял это.

Вместо того, чтобы создавать, я знаю, что

before_validation :assign_to_conversation, :on => :create, :unless => :conversation

Кажется, все работает сейчас. И все заключено в транзакцию.

Есть мысли?

0 голосов
/ 17 февраля 2011

Попробовал заменить build_conversation на create_conversation?

...