代码之家  ›  专栏  ›  技术社区  ›  ARemesal

Rails:从表中为循环的每个i操作获取数据

  •  28
  • ARemesal  · 技术社区  · 17 年前

    我如何根据MVC做到这一点?在视图中,我可以将代码放入循环中,但我认为这太可怕了。

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

    5 回复  |  直到 6 年前
        1
  •  48
  •   Orion Edwards    17 年前

    如果您有一个表,并且希望从另一个表中获取数据,通常情况下是 has_many 关系例如,我们有 @people Person 模型),以及每个人 你有很多 地址( 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
  •  1
  •   IDBD    17 年前

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

        3
  •  1
  •   Adam Byrtek    17 年前

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

        4
  •  1
  •   thkala jaxb    14 年前
    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的答案最符合我的需要,但在那个例子中,address是Person表的空字段?或者如何向Person类附加新属性?

    尽管如此,我是否错过了执行此操作的任何SQL技巧?

        5
  •  0
  •   mwilliams    17 年前
    • 将@dataset项上的所有逻辑保留在控制器操作中
    • 利用模型中的方法与所需的其他模型对象进行交互
    • 对于视图,应该只剩下@dataset,您可以在局部视图中进行渲染。

    你需要进一步解释你的情况,以获得更多的答案。您需要与哪些类型的操作和其他模型进行交互?如果你把你的模特协会贴出来,我相信我们真的可以帮你摆平。

    祝你好运

    推荐文章