【问题标题】:View helper to remove inserting class object in view查看助手以删除视图中的插入类对象
【发布时间】:2025-12-04 18:15:03
【问题描述】:

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

【问题讨论】:

  • 你能用first_category_question方法更新帖子吗?

标签: ruby-on-rails ruby oop


【解决方案1】:

您这样做是在创建一个 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

【讨论】:

    【解决方案2】:

    您能否在类别和问题之间建立关系?

    例如,如果一个类别 has_many :questions 您可以执行 category.questions 来返回您需要的所有问题。

    为避免 N+1,您可以在控制器中使用 Category.includes(:questions).find_by(params) 通过一个数据库查询将它们全部拉入。

    如果您希望我解释更多,请告诉我。

    【讨论】: