我是铁轨上的初学者。我在一个小应用程序上工作,我有一个设计问题。 我认为我的观点中有太多的逻辑,不应该这样做。
这是我的控制器:
if params[:search] @hosts=Host.all @total = {} @total_by_group={} @search=true Disks.search(params[:search]).each do |disk| if @total[disk.host.name] @total[disk.host.name]+=disk.capacity else @total[disk.host.name]=disk.capacity end if @total_by_group[disk.group.name] @total_by_group[disk.group.name]+=disk.capacity else @total_by_group[disk.group.name]=disk.capacity end end end
我的观点:
- if @search - @hosts.each do |host| - if @total[host.name] %br %table %tr %th host %th total size - host.groups.each do |group| - if @total_by_group[group.name] %th=group.name %tr %td=host.name %td=sprintf("%0.02f", @total[host.name]) - host.groups.each do |group| - if @total_by_group[group.name] %td=sprintf("%0.02f", @total_by_group[group.name])
它工作正常但感觉不对。我认为我的观点需要更简单。
我搜索过,我发现了一些人们构建模型来存储结果的解决方案,但是当我改变我的请求并且需要某种方法来清理时,它似乎对我来说太过分了,并且在模式上添加了很多工作。桌子过了一段时间。
做类似事情的轨道方式是什么?
由于
阿兰
答案 0 :(得分:2)
你控制器中唯一应该拥有的是:
if params[:search]
@disks = Disks.custom_search(params[:search])
end
并在您的磁盘模型中添加类似
的内容def custom_search term
find_by_field(term, :include => :host)
其他所有内容都应该在您传递磁盘变量的辅助方法中,并返回视图的计算结果。 @search实例变量不是必需的,因为params在视图和辅助方法中可用。
好的,你告诉我的第一个例子应该在模型中。请记住,模型数据的任何表示都应来自您的模型,甚至是未存储在数据库中的数据计算。
类似的东西:
#view
- @disks.collect(&:host).each do |host|
- host.groups.each do |group|
= group.name
= group.disks_capacity
#your model group.rb
def disks_capacity
disks.map{|disk| disk.capacity}.sum # with disks.map we're talking about the disks which belong to this instance of group
end
通过向xyz_helper.rb添加方法来定义辅助方法。
如果我可以诚实地建议您购买一本书并通过它来完成。我可以保证你会享受学习铁轨的经验,让自己更轻松,从长远来看节省大量时间。
答案 1 :(得分:0)
我尝试根据mark的评论改进我的代码。
我从控制器中删除了一些代码:
if params[:search] @disks= Disks.custom_search(params[:search]) end
我添加了一些助手:
def host_total(host) @disks.host(host).sum(:capacity) end def list_hosts @disks.joins(:hosts).group("hosts.name").select("hosts.name") end def list_dgroup_by_host(host) @disks.host(host).group("dgroups.name").select("dgroups.name") end def capacity_by_dgroup(group) @disks.by_dgroup(group).sum(:capacity) end
这是我的部分观点:
- list_hosts.each do |host| %br %table %tr %th host %th total size - list_dgroup_by_host(host.name).each do |group| %th=group.name %tr %td=host.name %td= host_total(host.name)) - list_dgroup_by_host(host.name).each do |group| %td=capacity_by_dgroup(group.name)
我认为它可以改进,但我不知道如何。如果有人能提出建议,我会很高兴: - )