View Helper删除视图中的插入类对象

时间:2018-09-07 15:57:37

标签: ruby-on-rails ruby oop

我的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,并在视图中提供该变量,但是我有一个参数(类别)。

2 个答案:

答案 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)通过一个数据库查询将它们全部拉入。

让我知道是否要我解释更多。