【问题标题】:In Rails, how do you swap a new object for an existing one?在 Rails 中,如何将新对象替换为现有对象?
【发布时间】:2011-05-30 00:00:09
【问题描述】:

我有以下嵌套模型关系:

  • 国家(ID、名称)
    • 省(id、country_id、名称)
      • 城市(id、province_id、名称)

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

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

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

【问题讨论】:

  • 你能告诉我们更多关于你遇到的麻烦的信息吗?是否抛出错误?如果是这样,他们怎么说?您向我们提供的信息越多,我们就越容易获得帮助。

标签: ruby-on-rails ruby model


【解决方案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 的“基于动态属性的查找器”部分

【讨论】:

  • 我可能会遇到与使用find_or_initialize_by_name 相同的问题:嵌套模型不使用此方法,因此它在国家/地区可以正常工作,但该省会引发验证错误,因为在内部它不调用find_or_initialize_by_name
  • 我不明白你想让你的省模型做什么。想要运行什么代码,你希望它如何表现?如果是我,我会简单地找到/创建国家,然后将国家 ID 传递给你用来创建省份的任何函数;那么省份就不需要自动创建国家了。但如果你真的想的话,你应该能够让它发挥作用。
  • 我知道find_or_initialize 方法,我在我的问题中将其列为失败的尝试(至少根据我的尝试)。嵌套关系则相反;一个国家被创建并接受省份的嵌套属性。反过来,省份接受城市的嵌套属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多