新手问题 关于控制器,模型,以及视图的一些问题?

lmm19891114 · 2015年01月31日 · 最后由 liwei78 回复于 2015年01月31日 · 1762 次阅读

今天在看 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 来包装。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号