今天在看 web 开发敏捷之道遇到了一些问题
比如一个 Product 模型里写了一个 total_price 的方法,在 products/show.html 里是不是不能直接调 total_price() 这个方法?是不是需要在 product_helper 里写 total_price 方法,才能在 view 层里调取
不用,可以在 view 中直接 call model 的类方法和实例方法
#1 楼 @liwei78 这样是吧
In Model:
class Product < ActiveRecord::Base has_many :line_items def income self.line_items.sum(:price) end def cost self.line_items.sum(:cost) end def profit self.income - self.cost end end
Then in Controller:
def show @products = Product.all end
And in View
<% @products.each do |product| %> Product Name: <%= product.name %> Product Income: <%= product.income %> Product Cost: <%= product.cost %> Product Profit: <%= product.profit %> <% end %>
可以,但是你留意下 log,这里性能不好,建议优化,一条 sql 就能搞定。
controller:
@products = Product .select("id,name,sum(line_items.price) as income, sum(line_items.cost) as cost, sum(line_items.price) - sum(line_items.cost) as profit") .joins("left join line_items on line_items.product_id = products.id")
model 中的都可以删了,其他不变。
#4 楼 @liwei78 rails 里好像很少这样直接在控制器里这样干得吧
#5 楼 @lmm19891114 教程的目的是理解实例方法,但是实际开发还得考虑性能的。
#4 楼 @liwei78 浓浓的 PHP 味道,哈哈,好吧这招其实很不错,不过除非真的已经遇到性能瓶颈否则我是不愿意这样写的。
#7 楼 @blacktulip 最近看了《Growing.Rails.Applications.in.Practice》,书里是建议 model 中只保留 关联,校验,callback 等,不要破坏 model 中定义的内容。我认为很对,在后期重构或维护他人代码时,面对众多类似 lz 写的方法,真让人手足无措呀。
你不知道哪里用了这个方法,而它只做了一件是,而这一件事又不该这么做。
#8 楼 @liwei78 model 只保留那几样可以,不过应该是 extract 到外面去,而不是一大条 SQL 塞在 controller 里面吧?
#9 楼 @blacktulip 是的,应该用一个 ProductReport 来包装。