论坛首页 编程语言技术论坛

美就是生产力(Rails美学宣言阐释)

浏览 42269 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-04-25  
多给些建议. 暂时项目中还用不到,对ruby有兴趣,看哪本书啊?
0 请登录后投票
   发表时间:2006-04-25  
出去买了包烟,继续来
class Person < ActiveRecord::Base
     belongs_to :account
end
class Account < ActiveRecord::Base
   has_many :people 
end


假设Person有一个first_name和last_name属性,好

Account.find(:first).people.find_or_create_by_first_name_and_last_name("Richard", "Feynman")


你是否想起一些事情,无数次,你取一个和上面一样的名字,用XXXQL写好DAO,写Service,但是这些事情是人干的吗?

当然不是,我们有meta-programming,有Dynamic Code Generation

且慢,find_by_XXX_and_XXX_and_XXX当然简单,如果不是这样,我希望直接用名字去去呢?

OK,你可以任意定义
class Account < ActiveRecord::Base
  has_many :people do
    def find_or_create_by_full_name(name)
      first_name, *last_name = name.split
      last_name = last_name.join " "
      find_or_create_by_first_name_and_last_name(first_name, last_name)
    end
  end
end


person = Account.find(:first).people.find_or_create_by_full_name("Richard Feynman")


你还有写DAO的欲望吗,你不想一路....到头吗(当然不可以)
0 请登录后投票
   发表时间:2006-04-25  
这本书的作者叙事方式很奇怪,似乎比较waterfull,不过用作入门还是不错的
0 请登录后投票
   发表时间:2006-04-26  
potian 写道
这本书的作者叙事方式很奇怪,似乎比较waterfull,不过用作入门还是不错的

整个一个代码生成器 。
错了不是代码生成器。比代码生成器先进多了。
应该是动态组装Class。
比如动态加入method。。。。。。


有了这个理念,很多通用的工作就可以做出来了。
0 请登录后投票
   发表时间:2006-04-26  
当然,你可以不定义在关系上
class Post < ActiveRecord::Base
    has_many :comments
end
class Comment < ActiveRecord::Base
  def self.search(query)
    find(:all, :conditions => ["body = ?", query])
  end
 end


Comment Load (0.000582)   SELECT * FROM comments WHERE (comments.post_id = 1) AND (body = 'hi')


Post.find(1).comments.search "hi"


你还可以有很多方法,包括extend,但是抛开这些,我们来看一个更妙的

class Comment < ActiveRecord::Base
   belongs_to :post
end

class Post < ActiveRecord::Base
  has_one :last_comment,
    :class_name => "Comment",
    : order => "created_at desc"
  has_many :comments
end

Post.find(1).comments.create(: body => 'You will see')

Post.find(1).last_comment


自然, Post有很多comments,但是它只有一个最后的注释?

Rails是什么,Rails就是在Web环境下提供创建DSL的框架,如果用户想知道你在干什么

show your code!
0 请登录后投票
   发表时间:2006-04-26  
你想当作什么?

如果你可以有(has) 什么,或者你属于(belongs to)什么,当然你也可以当什么

回到我们Xper们热爱的东东

class Iteration < ActiveRecord::Base
  has_many :stories,
    : order => "position"
end
class Story < ActiveRecord::Base
  belongs_to :iteration
  acts_as_list :scope => :iteration
end


这里稍微变化的是Story在Iteration中是有顺序的,所以Story把自己当作列表

iteration1 = Iteration.create(:name => "iteration 1") 
story1 = Story.create(:name => "story 1")
story2 = Story.create(:name => "story 2")
story3 = Story.create(:name => "story 3")

iteration1.stories << story1
iteration1.stories<< story2
iteration1.stories<< story3


还要解释吗,还需要什么add_story之类的东东吗,byebye

def show_iteration_stories(iteration)
  iteration.stories.map {|story| story.name}.join ","
end


这个就是显示所有的story名字

show_iteration_stories(iteration1)
["story 1,story 2,story 3"]


客户告诉我们story3应该往上一点,优先级比较高,我们:
stroy3.move_higher

然后给客户看

show_iteration_stories(iteration)
"story 1,story 3,story 2"


客户高兴了,又一天,客户发现story1应该放到最后
story1.move_to_bottom


然后给客户看
show_iteration_stories(iteration)
 "story 3,story 2,story 1"


我们的客户真的非常满意,哈哈

rails还有一个acts_as_tree,可以用作自包含的树,例如组织机构、地区等等,在某些情况下,树的子应该是需要排序的,免得每次取出来的顺序堵不一样,所以可以结合两者写一个Acts_As,大概7-8行声明性的代码,Rails是一件关于少写代码,写更可以理解的代码的事情,不是吗

另外有一个acts_as_nested和acts_as_thread,可以在11分钟内写一个简单的论坛
0 请登录后投票
   发表时间:2006-04-26  
休息休息,下次再来
0 请登录后投票
   发表时间:2006-04-26  
firebody 写道
potian 写道
class Account < ActiveRecord::Base
   validates_presence_of :subdomain,:name, :email_address, :password
   validates_uniqueness_of :subdomain
   validates_acceptance_of :term_of_service, :on=>:create
   validates_confirmation_of :password, :email_address, :on=>:create
end


我不知道没用过rails的人会怎么理解,OK 我来读一遍,Account是一个ActiveRecord,但是你要小心了:
1。 subdomain,name,email_address,password必须存在(有值)
2。subdomain要唯一的哦
3。你必须接受term of service,当然不是每次你都要这么麻烦,只是在建账户的时候
4。两次密码必须一样,为了防止你的email地址不对,也确认一下吧

我相信读了这一遍以后,你马上就明白了(可能我没读你就明白了)

一个经常在程序里面碰到的问题是验证,而模型层的验证是必须有的,你碰到过比这更简洁、完美的验证机制吗,我只知道是麻球一样的XML,看起来无比强大的表达式和验证框架。。。

这样的强验证/约束模型确实是渴望的。
一个问题: 这样的验证要跟数据库作频繁的SQL嘛?
比如保证唯一。


你看见那个: on参数了么? 如果不声明的话默认是: on=> :save 也就是保存到数据库时才检查一下. 还有更强的是: on => :update, 既内存中的AR对象更改时就检查.
0 请登录后投票
   发表时间:2006-04-26  
potian 写道
休息休息,下次再来

辛苦啦
0 请登录后投票
   发表时间:2006-04-26  
我觉得至少要先看看 Programming Ruby 的第一章,如果可以再看看第二章,然后就可以看 Agile Book 了。

如果真用 Rails  开发网站, 可能中间碰到的问题还会很多的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics