【问题标题】:How complicated can Rails models be? sample projects?Rails 模型可以有多复杂?示例项目?
【发布时间】:2011-03-22 21:52:58
【问题描述】:
我正在尝试超越 Rails 的 初学者 阶段并进入 中级,但我发现很难找到更高级的示例来学习。
例如,我读到您需要小心“嵌套路由”,并且深度不应超过 2。在这种情况下会发生什么?
- 客户可以下很多订单
- 订单可以有多个项目
- 项目可以有多种类型的选项
- 每种类型的选项都可能有限制:在某些日子可用,或需要选择,或影响总价等。
这对 Rails 来说是个傻事还是简单的事情。我假设是后者,但找不到任何有趣的示例项目(源)可供学习?书籍似乎只停留在基础......想法?
【问题讨论】:
标签:
ruby-on-rails
model
data-modeling
【解决方案1】:
您可以尽可能深入地使用嵌套路由,但请记住,仅仅因为您可以并不意味着您应该这样做。你挖掘得越深,你为自己创造的工作就越多。
我看到的模式是,对于每个深度级别,您需要创建一个处理父参数的基本控制器和一个处理细节的子类。这往往会按照以下方式进行:
Customer::BaseController < ApplicationController
CustomerController < CustomerController:: BaseController
Customer::Orders::BaseController < Customer::BaseController
Customer::OrdersController < Customer::Orders::BaseController
Customer::Orders::Items::BaseController < Customer::Orders::BaseController
Customer::Orders::ItemsController < Customer::Orders::Items::BaseController
在每种情况下,BaseController 都以通用方式处理参数的加载和解释,例如:
class Customer::BaseController < ApplicationController
before_filter :load_customer
protected
def load_customer
@customer = Customer.find(params[:customer_id] || params[:id])
rescue ActiveRecord::RecordNotFound
render(:partial => 'customer_not_found', :layout => 'application', :status => :not_found)
end
end
如您所见,如果您以这种方式规划您的应用程序,可能会有些复杂。你最终也会得到很长的路线。
如果您的数据库被设计成记录是相当自治的,并且可以从中推断出很多关系信息,那么您不一定需要费心费力。订单页面可以提供到 @order.customer 的链接,而无需在路径中包含 customer_id。
【解决方案2】:
嗯,我同意你的观点,很多书都是从基础开始和结束的。
但是,如果您感到无聊,您应该坐下来构思一个想法。如果你在做一个真正的项目,那总是最好的乐趣。
从示例和虚幻场景中学习可能会有所帮助,但在某些时候是时候迎接挑战了。
就我个人而言,在完成“使用 Rails 进行敏捷 Web 开发”之后,我就不再看书了。然后我开始做自己的失败并从中吸取教训。
从理论上讲,您可以尝试为可能遇到的每种“中级”或“高级”情况做好准备。
老实说,我与问题的斗争与书本中的任何理论场景无关。我必须坐下来,跟踪问题,阅读回溯,思考它们,谷歌搜索类似的问题,编写测试......这真的帮助我获得了经验。
走出去寻找或发展一个想法。如果有,请编写测试并尝试实现它。
这将为您提供动力,您可能正在寻找。
注意:http://github.com 是查找源代码以查看和学习的好地方。