Ruby on rails FactoryGirl与递归模型

Ruby on rails FactoryGirl与递归模型,ruby-on-rails,factory-bot,Ruby On Rails,Factory Bot,我很难弄清楚如何为引用父类的has\u many/behing\u 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

我很难弄清楚如何为引用父类的has\u many/behing\u 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'
class PrivateMessage“PrivateMessage”#对父消息的引用
有多个:回复,:class\u name=>'PrivateMessage',:foreign\u key=>'conversation\u id',
订单:“在描述处创建”
我有点不知所措,不知如何处理这个问题,或者在这种情况下我是否应该使用工厂。在我的控制器中,如果对话\u id通常为零(使用profile.sent\u messages.build),我将创建一条消息,否则,如果发送方/接收方之间存在任何消息,我将引用父消息,并使用父消息\u message.repress.build来生成它

我想我需要一个带有后构建钩子的嵌套工厂,但我不知道该怎么做。像这样的?我在上面定义了私有消息。这显然是错误的,但我走对了吗?如何使用after_构建块引用父消息

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    
factory:private\u消息do
sequence(:body){n}“这是一条消息的正文:){n}”
关联:发件人
协会:接收人
结束
工厂:回复吗
关联:私有消息
sequence(:body){n}“这是回复的主体{n}”
关联:发件人
协会:接收人
|构建完成后|私人|消息|

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

像这样的事情有意义吗

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

您可能会让您的生活更轻松,将对话分成一个单独的模式…

非常有效,谢谢。我花了一分钟才意识到我需要使用let!而不是让它工作,但这很简单。谢谢你的帮助。