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