2008-11-11 90 views
25

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

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

我必须使用助手来做到这一点,并从视图中调用函数?

谢谢你在前进,

- ARemesal

回答

42

如果你有一个表,并且想要从另一个表中获取数据,通常这是在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| 
    ... 
+0

对于我的紫袍,我认为这是最好的解决方案。感谢Orion提供了一个提示,给了我很多新的想法:) – ARemesal 2008-11-13 09:39:11

1

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

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

0
  • 把所有的逻辑上的@DataSet项目中的控制器动作
  • 利用你的模型与其他模型相互作用的方法中的对象,你需要
  • 你应该只剩@DataSet您的看法你可以在局部渲染。

您需要进一步解释您的情况,以获得更多的答案。你需要什么类型的操作和其他模型进行交互?如果你发布你的模型协会,我相信我们可以真正摆脱你。

祝你好运!

1

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

+0

我认为这是一个很好而漂亮的解决方案,但这对我的需求来说太复杂了。我会为未来添加注释:) – ARemesal 2008-11-13 09:41:46

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

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

我想避免这种情况的看法。我认为Orion Edwards的答案是最接近我需要的,但是在那个例子中,地址是Person表的空字段?或者我怎样才能将一个新的属性添加到Person类?

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

相关问题