Ruby on rails Rails在不使用db查询的情况下查找或初始化
是否有任何rails方法与Ruby on rails Rails在不使用db查询的情况下查找或初始化,ruby-on-rails,ruby,dry,Ruby On Rails,Ruby,Dry,是否有任何rails方法与find\u或
find\u或
相同,但不使用数据库查询
问题是:
1。)它可能导致类似“n+1”的查询。
例如,我有一个问题
模型,有许多:翻译
将其连接到翻译
模型,该模型具有属性(列)语言
和值
。编辑问题时,我有一个嵌套的:translations
,但首先我需要在控制器中构建缺少的语言。如果我这样做
%w(en hu fr de it).each do |lng|
@question.translations.find_or_initialize_by(language: lng)
end
它将每五种语言运行一次查询,即使我已经加载了:translations
2。)它找不到非持久化元素(正是因为在数据库中进行了查询)
因此,如果在上一个表单中,有人只填写@question
的“en”翻译,提交表单,但某些验证失败,表单会重新呈现错误消息,则有两种可能:我不运行每种语言的查找或\u initialize\u by
(在这种情况下,仅显示“en”字段),或者我运行它(并且“en”字段将被复制-第一个字段将包含已提交但未保留的值
,第二个字段将为空)
我使用的是以下内容(在每个的块中):
这很好,但我认为它不够干(因为它重复了@question.translations
,语言
和lng
),我真的希望有一些“rails way”来做到这一点
任何想法都将受到欢迎。使用类似“查找”相关的方法将进行查询,但您的最终目标是什么?在表单中预先填充这些翻译的字段?如果是这样,您可以使用
接受嵌套的属性\u:translations
并构建@question。translations
仅在“新建”中控制器中的操作。让我知道这是否是您所要求的,我将详细说明answer@JoseCastellanos想象一下@question的表单有一些自己的字段(标题、默认语言…),然后是翻译的字段(满足所有需要:接受
的
嵌套的
语言隐藏的字段和值文本字段。目标是用户可以看到所有可能的语言(一次)即使该语言没有翻译(如果值为空,我拒绝翻译)。这解释得好吗?
@question.translations.select{ |t| t.language == lng }.first ||
@question.translations.build(language: lng)