2011-05-30 30 views
2

我有如下嵌套模型关系:在Rails中,如何交换现有对象的新对象?

  • 国家(ID,姓名)
    • 省(ID,COUNTRY_ID,名)
      • 城市(ID,province_id,名)

我有validates_uniqueness_of约束int在关系中的每个模型的名称字段上,以及数据库中名称列上的唯一索引。

我想在验证之前的某个时间点交换一个与现有记录具有相同名称的新对象。换句话说,如果用户尝试添加已添加的城市,省份和国家/地区组合,我希望国家/地区模型返回对相应现有模型记录的引用,而不是在保存前验证失败。

我无法使用模型回调(after_initialize,before_validation等),我无法让Country.find_or_initialize_by_name与嵌套模型一起工作......有什么建议吗?

+0

的“基于动态属性的查找程序”部分。您能给我们提供一些关于您遇到麻烦的更多信息吗?错误是否被抛出?如果是这样,他们说什么?你给我们提供的信息越多,帮助就越容易。 – sosborn 2011-05-30 02:40:19

回答

1

你试图做的事听起来很难,可能需要你了解ActiveRecord::Base的很多内部实现细节。

相反,你可以做这样的事情吗?

@country = Country.find_or_initialize_by_name(params[:name]) 
... 
@country.save 

编辑: ActiveRecord的内置了find_or_create_by_XXXfind_or_initialize_by_XXX功能,所以没有必要的功能添加到模型。欲了解更多信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Base.html

+0

我可能会遇到同样的问题,我已经使用'find_or_initialize_by_name':嵌套的模型不使用此方法,所以它将在国家正常工作,但该省将抛出验证错误,因为它内部它不会调用'find_or_initialize_by_name'。 – Andrew 2011-05-30 00:34:34

+0

我不明白你想要省模型做什么。什么代码想运行,你希望它的行为如何?如果是我,我只需找到/创建国家,然后将国家ID传递给您用来创建省的任何功能;那么省就不需要自动创建国家了。但是如果你真的想要的话,你应该能够做到这一点。 – 2011-05-30 00:37:37

+0

我知道'find_or_initialize'方法,我把它列为在我的问题中失败的尝试(至少按照我的尝试)。嵌套关系是相反的;一个国家被创建并接受各省的嵌套属性。反过来,一个省接受城市的嵌套属性。 – Andrew 2011-05-30 00:53:47

相关问题