我有一个循环(对于@dataset中的项目),我想在每次迭代中从另一个表中获取不同的数据,并进行一些将在视图中打印的操作。我无法从循环中使用的数据集中获取此数据。
我怎么能根据MVC做到这一点?我可以将代码放入循环中,在视图中,但我认为这很糟糕。
我必须使用助手才能执行此操作,并从视图中调用该函数吗?
提前谢谢你,
- ARemesal
答案 0 :(得分:45)
如果您有一个表,并且想要从另一个表中获取数据,通常情况是has_many
关系。例如,我们有@people
(Person
模型),每个人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)
您需要进一步解释您的情况以获得更多答案。您需要与哪些操作和其他模型进行交互?如果你发布你的模特协会,我相信我们真的可以把你拉开。
祝你好运!