如何在另一个对象的创建中创建对象?

时间:2015-08-12 18:45:14

标签: ruby-on-rails ruby model initialization mongoid

我在铁轨和mongoid上使用红宝石。我有一个名为Project的模型和名为Person的模型。我想在初始化新项目时自动创建一个新的Person对象。有没有什么方法可以插入代码来在Project模型中创建一个新的Person。例如,当我执行“Project.create(:name =>'Project 1')”时,我希望它能自动创建一个新的Person对象。我已经在模型之间宣布了一对一的关系。

我是否需要重写Project模型的create方法?

3 个答案:

答案 0 :(得分:0)

在您的项目模型中:

after_create :init_first_person

def init_first_person
    self.people.create(name: 'Initialized User')
end

答案 1 :(得分:0)

你最初提到的问题

  

我想在初始化新项目时自动创建一个新的Person对象。

(顺便说一句,这是一个非常糟糕的主意),但后来你似乎只想在创建项目时创建一个Person。

在这种情况下,我的建议是在Project模型中定义您可以调用的自定义方法。不要害怕定义新方法。它比使用回调或覆盖现有的默认方法更好。

class Project

  def self.create_project_and_user(attributes = {})
    # create the user
    [... ]

    # create the project
    create(attributes)
  end

end

然后在您的控制器中,您将拨打Project.create_project_and_user(...)

答案 2 :(得分:0)

另一个解决方案是创建服务对象,看起来像这样:

class CreateProjectService
  def initialize(params)
    @params = params
  end

  def call
    project = Project.create(params[:project])
    project.person = Person.create
  end
end

然后你可以在控制器中使用这个PORO(Plain Old Ruby Object),通过请求中的params创建它并调用它。如果在创建项目时还有其他事情要做,那么您只需将此逻辑添加到服务中。

阅读有关Rails应用程序中使用的模式的非常好的文章,以便进一步阅读here