【问题标题】:Rails: getting data from a table for each iteraction of a loopRails:为循环的每次迭代从表中获取数据
【发布时间】:2010-09-21 19:42:15
【问题描述】:

我有一个循环(for item in @dataset),我希望在每次迭代中从另一个表中获取不同的数据并进行一些将在视图中打印的操作。我无法从循环中使用的数据集中获取这些数据。

如何根据 MVC 执行此操作?我可以将代码放入循环中,在视图中,但我认为这很可怕。

我必须使用助手来执行此操作,并从视图中调用该函数吗?

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller


    【解决方案1】:

    如果你有一个表,并且想从另一个表中获取数据,通常是has_many关系的情况。例如,我们有@peoplePerson 模型),每个人都有has_many 地址(Address 模型)。在这些情况下,最好的办法就是这样做

    # Controller
    @people = Person.find(:all, :include => :addresses)
    ...
    
    # View
    @people.each do |p|
      p.addresses.each do |address|
        ...
    

    如果您的数据不只是普通的数据库表(也许您从 Web 服务等获取),那么最好提前在控制器中构建所有数据,然后将其传递到视图。像这样的

    # Controller
    @people = Person.find(:all)
    @people.each do |p|
      # attach loaded data to the person object in controller
      p.addresses = Address.load_from_somewhere_by_name(p.name)
    ...
    

    这样视图代码保持干净,如下所示:

    # View
    @people.each do |p|
      p.addresses.each do |address|
        ...
    

    【讨论】:

      【解决方案2】:

      如果没有有关数据和模型(表)之间关系的详细信息,很难说出问题的最佳解决方案。接下来是一个共同的想法:保持你的观点愚蠢。获取在控制器操作中呈现视图所需的所有数据。在同一操作中进行所有更改和计算。然后在视图中使用这些数据。

      顺便说一句,如果您谈论的是 N+1 问题,请阅读有关“包含”和“加入”ActiveRecord 参数的更多信息。

      【讨论】:

        【解决方案3】:

        如果我是你,我会创建一个单独的类来封装数据集并包含处理数据集条目所涉及的所有逻辑。这个类可以是可迭代的(响应每个)。然后我会将这个类的一个实例传递给视图并在那里只使用它的方法。

        【讨论】:

        • 我认为这是一个很好的解决方案,但在这种情况下它对于我的需求来说太复杂了。我会为将来注释它:)
        【解决方案4】:
        Person(id, name, other fields...)
        Event(id, title, ...)
        Date(id, date, time, event_id, ...)
        Disponibility(id, percent, date_id, person_id, ...)
        

        当然,所有的关系都在模型中定义。

        我有一个显示事件所有日期的视图,这很简单。但我想,对于每个日期,打印该日期所有可用的人的数据。在我看来,忘记 MVC 设计模式,我可以编写如下代码:

        <% for date in @Dates 
          available = Disponibility.find_by_date_id(date.id)
          for item in available
            guy = Person.find_by_id(item.person_id)
        %>
        

        呈现日期和可用人员...

        我想在视图中避免这种情况。我认为 Orion Edwards 的答案是我需要的最接近的答案,但是在那个例子中,地址是 Person 表的空字段?或者如何将新属性附加到 Person 类?

        尽管如此,我是否错过了任何 SQL 技巧?

        【讨论】:

          【解决方案5】:
          • 将 @dataset 项上的所有逻辑保留在控制器操作中
          • 利用模型中的方法与您需要的其他模型对象进行交互
          • 应该只为您的视图留下@dataset,您可以在部分中渲染。

          您需要进一步解释您的情况才能获得更多答案。您需要与什么样的操作和其他模型进行交互?如果你发布你的模特协会,我相信我们真的可以让你远离。

          祝你好运!

          【讨论】:

            猜你喜欢
            • 2018-08-25
            • 2017-07-03
            • 1970-01-01
            • 2017-04-28
            • 1970-01-01
            • 1970-01-01
            • 2014-07-06
            • 2020-12-16
            • 1970-01-01
            相关资源
            最近更新 更多