是否存在与find_or_initialize_by
相同的rails方法,但没有数据库查询?
问题是:
1。)它可能导致类似“n + 1”的查询。
例如,我有一个Question
模型,has_many :translations
将其与Translation
模型连接,该模型具有属性(列)language
和value
。在编辑问题时,我有一个: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.translations
,language
和lng
),我真的希望有一些“rails方式“这样做。
任何想法都将受到赞赏。