0

我无法弄清楚如何使用引用父类的 has_many/belongs_to 关系为我的类设置工厂。它设置如下。

class PrivateMessage < ActiveRecord::Base
  attr_accessible :body, :read_at, :title, :receiver_id, :sender_id, :conversation_id
  belongs_to :sender, class_name: 'Profile', foreign_key: 'sender_id'
  belongs_to :receiver, class_name: 'Profile', foreign_key: 'receiver_id'
  belongs_to :conversation, :class_name => 'PrivateMessage'  # Reference to parent message
  has_many :replies,  :class_name => 'PrivateMessage', :foreign_key => 'conversation_id',
    order: 'created_at DESC'

我不知道如何处理这个问题,或者在这种情况下我是否应该使用工厂。在我的控制器中,如果 conversation_id 通常为 nil,我会创建一条消息(使用 profile.sent_messages.build),否则如果发送方/接收方之间有任何消息,我会引用父消息,并使用 parent_message.replies.build 构建它.

我想我需要某种带有 after_build 钩子的嵌套工厂,但我不能完全理解如何去做。像这样的东西?我在上面定义私人消息的地方。这显然是错误的,但我在正确的轨道上吗?如何使用 after_build 块引用父消息?

factory :private_message do
  sequence(:body) { |n| "This is a body of a message :) #{n}" }
  association :sender
  association :receiver
end  

factory :reply do
  association :private_message
  sequence(:body) { |n| "This is the body of a reply #{n}" }
  association :sender
  association :receiver
  after_build do |private_message|
    private_message.replies << :reply
  end  
end    
4

1 回答 1

0

如果我理解这个问题...

这样的事情有意义吗?

factory :private_message do
  sequence(:body) { |n| "This is a body of a message :) #{n}" }
  association :sender
  association :receiver

  factory :reply do
    sequence(:body) { |n| "This is the body of a reply #{n}" }
    association :conversation
  end
end

你可能会让你的生活更容易将对话分成一个单独的模型......

于 2012-08-21T16:59:24.547 回答