Rails find_or_initialize_by没有数据库查询

时间:2017-02-08 21:16:39

标签: ruby-on-rails ruby dry

是否存在与find_or_initialize_by相同的rails方法,但没有数据库查询

问题是:

1。)它可能导致类似“n + 1”的查询。

例如,我有一个Question模型,has_many :translations将其与Translation模型连接,该模型具有属性(列)languagevalue。在编辑问题时,我有一个:translations的嵌套表单,但首先我需要在控制器中构建缺少的语言。如果我做

%w(en hu fr de it).each do |lng|
  @question.translations.find_or_initialize_by(language: lng)
end

即使我已经加载了:translations,也会为每五种语言运行查询。

2.)它找不到非持久化元素(完全是因为在数据库中查询)。

因此,如果在上一个表单中有人只填写@question的'en'翻译,则提交表单,但是某些验证失败,表单会重新呈现并显示错误消息,有两种可能性:要么我做为每种语言运行find_or_initialize_by(在这种情况下, 将显示'en'字段),或者我< em>运行它('en'字段将 重复 - 第一个将包含已提交但未保留的value,第二个将包含是空的)

我使用的是以下内容(each内部):

@question.translations.select{ |t| t.language == lng }.first ||
    @question.translations.build(language: lng)

效果很好,但我认为它不够干净(因为它重复了@question.translationslanguagelng),我真的希望有一些“rails方式“这样做。

任何想法都将受到赞赏。

0 个答案:

没有答案