在Rails中,如何为现有对象交换新对象?

时间:2011-05-30 00:00:10

标签: ruby-on-rails ruby model

我有以下嵌套模型关系:

  • 国家/地区(身份证,姓名)
    • 各省(id,country_id,姓名)
      • 城市(id,省_id,姓名)

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

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

我在使用模型回调(after_initializebefore_validation等)时遇到问题,而我无法让Country.find_or_initialize_by_name使用嵌套模型...有什么建议吗?

1 个答案:

答案 0 :(得分: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

的“基于动态属性的查找程序”部分