Rails:为循环的每次迭代从表中获取数据

时间:2008-11-11 15:01:43

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

我有一个循环(对于@dataset中的项目),我想在每次迭代中从另一个表中获取不同的数据,并进行一些将在视图中打印的操作。我无法从循环中使用的数据集中获取此数据。

我怎么能根据MVC做到这一点?我可以将代码放入循环中,在视图中,但我认为这很糟糕。

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

提前谢谢你,

- ARemesal

5 个答案:

答案 0 :(得分:45)

如果您有一个表,并且想要从另一个表中获取数据,通常情况是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|
    ...

答案 1 :(得分:1)

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

顺便说一下,如果你在谈论N + 1问题,那么请阅读更多关于'include'和'join'的ActiveRecord参数。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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)
%>

渲染日期和可用人员......

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

虽然,我错过了任何SQL技巧吗?

答案 4 :(得分:0)

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

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

祝你好运!