我的rails应用程序中有一个页面,在该页面上我要遍历类别的集合并为其添加链接。该链接将转到类别页面
<%@categories.each_with_index do |category, index|%>
<div class="category-result">
<div class="category-title"><%= link_to category["name"],
admin_question_path(index:
Question.first_category_question(category))%></div>
...
我已经在下面定义了方法
def self.first_category_question(category)
Question.get_all_questions_by_category(category["name"])
.first.question_index
end
滑轨中是否有移动的方法 向助手的Question.first_category_question(category)。我通常将其保存到控制器中的实例变量,例如@first_category_question,并在视图中提供该变量,但是我有一个参数(类别)。
答案 0 :(得分:0)
您正在通过这种方式创建N + 1问题。像您所说的那样,通过提前在控制器中准备数据来避免这种情况。预先在控制器中进行所需的查询,以通过一次对数据库的调用来进行查询,然后构建一个哈希数组,并使用该哈希值在视图中构建您的链接,而无需对数据库进行任何其他调用。
您将具有一系列类似于以下内容的散列:
@categories_and_questions = [{ name: 'category1', index: 1 }, { name: 'category2', index: 3 }]
@categories_and_questions.each do |cat|
<div class="category-result">
<div class="category-title"><%= link_to cat[:name],
admin_question_path(index: cat[:index])%></div></div>
end
答案 1 :(得分:0)
您能在类别和问题之间建立联系吗?
例如,如果类别为has_many :questions
,则可以执行category.questions来返回您需要的所有问题。
要避免N + 1,您可以在控制器中使用Category.includes(:questions).find_by(params)
通过一个数据库查询将它们全部拉入。
让我知道是否要我解释更多。