gpt4 book ai didi

ruby-on-rails - Rails 应用程序中的计算逻辑应该放在哪里?

转载 作者:行者123 更新时间:2023-12-04 14:52:56 25 4
gpt4 key购买 nike

我有一个模拟房屋的应用程序。 The House has_many Rooms、Rooms has_many Lights 和 Small_appliances 等。我还有一个名为 Calculator 的 Controller ,用于访问应用程序。使用计算器 Controller 将数据添加到房屋(及其房间)。然后生成一个报告,该报告位于 app/views/calculator/report.html.erb。

我的问题是报告的所有计算和逻辑应该去哪里?目前我在 View 中拥有所有内容,在calculator_helper 中有一些内容。通常这会出现在模型中,对吗?但是计算器没有生成的模型。这样做的标准是什么?

这是计算器 Controller 。

class CalculatorController < ApplicationController
def index
end

def save_house
@house = House.new(params[:house])
respond_to do |format|
if @house.save
format.html { render :action => 'add_rooms', :id => @house }
format.xml { render :xml => @house, :status => :created, :location => @house }
else
format.html { render :action => 'index' }
format.xml { render :xml => @house.errors, :status => :unprocessable_entity }
end
end
end

def add_rooms
@house = House.find(params[:id])
@rooms = Room.find_by_house_id(@house.id)

rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid house #{params[:id]}")
flash[:notice] = "You must create a house before adding rooms"
redirect_to :action => 'index'
end

def add_room
@room = Room.new(params[:room])
@house = @room.house

respond_to do |format|
if @room.save
flash[:notice] = "Room \"#{@room.name}\" was successfully added."
format.html { render :action => 'add_rooms' }
format.xml { render :xml => @room, :status => :created, :location => @room }
else
format.html { render :action => 'add_rooms' }
format.xml { render :xml => @room.errors, :status => :unprocessable_entity }
end
end
rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid house #{params[:id]}")
flash[:notice] = "You must create a house before adding a room"
redirect_to :action => 'index'
end

def report
flash[:notice] = nil
@house = House.find(params[:id])
@rooms = Room.find_by_house_id(@house.id)
rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid house #{params[:id]}")
flash[:notice] = "You must create a house before generating a report"
redirect_to :action => 'index'
end
end

最佳答案

有几种方法可以解决它,但逻辑肯定不属于 View 。如果我正确阅读了您的描述,您可以在清晰的层次结构中将各种模型相互关联,层次结构的顶部是 House 模型。在这种情况下,我将向 House 模型添加一组适当的方法,这些方法可能由对与给定 House 实例关联的 Room 模型中的计算方法的调用组成,并沿着关联线向下。这样可以在每个级别执行相关计算,并且通过在 House 模型级别组合一个或多个方法,您可以拥有一种干净、富有表现力和可维护的方式来处理计算。

还需要做的一件事是确保数据库可以执行的任何计算都是如此。例如,如果有一个 Room 模型可以通过简单地查询它自己的数据来完成的计算,那么无论如何都要使用 ActiveRecord 调用这种低级计算逻辑的能力将该计算负担推给 DB。查看 API docs详情。

我会非常仔细地查看您想要的逻辑,看看如何将它插入模型中,因为这可能是它所属的地方,接近计算的实际数据,并在专门表示该数据的类结构中;我不会仅仅为了处理计算逻辑而创建模型,除非您出于某种原因确实需要持久存储计算。

关于ruby-on-rails - Rails 应用程序中的计算逻辑应该放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com