锁定老帖子 主题:美就是生产力(Rails美学宣言阐释)
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-04-26
cookoo 写道 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对象更改时就检查. 模型的语义在保存到数据库的时候才得到反映? new的时候得不到反映? |
|
返回顶楼 | |
发表时间:2006-04-26
koalant 写道 robbin 写道 potian,我现在刚开始看ruby,你觉得我是先看programming ruby这本书呢,还是先看Agile Web development with ruby on rails呢,我的目标是希望学习1-2月以后,可以开始用rails开发网站。
我觉得至少要先看看 Programming Ruby 的第一章,如果可以再看看第二章,然后就可以看 Agile Book 了。 如果真用 Rails 开发网站, 可能中间碰到的问题还会很多的。 我就是看了Programming Ruby 的第一章就忍不住去看Agile Book 了,还好ruby的学习难度并不大,抽空做做例子还行。狠期待实战机会 |
|
返回顶楼 | |
发表时间:2006-04-26
http://poignantguide.net/ruby/
这个ruby的guide很搞啊,有人看吗..... |
|
返回顶楼 | |
发表时间:2006-04-26
to upstairs:
这是所有介绍程序语言的Guide里最生动的, 可以成为经典. |
|
返回顶楼 | |
发表时间:2006-04-26
firebody 写道 cookoo 写道 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对象更改时就检查. 模型的语义在保存到数据库的时候才得到反映? new的时候得不到反映? 比如Job.new, 这时对象里的member都是空的等着以后填值进去, 这时怎么验证? btw, :update我说错了, 这个古怪的trigger和:save类似, 但除了新建的对象. |
|
返回顶楼 | |
发表时间:2006-04-26
kaktos 写道 http://poignantguide.net/ruby/
这个ruby的guide很搞啊,有人看吗..... 看过, 不过因为缺乏文化背景, 有些地方看不出幽默 |
|
返回顶楼 | |
发表时间:2006-04-26
继续
class Product < ActiveRecord::Base has_and_belongs_to_many :categories end class Category < ActiveRecord::Base has_and_belongs_to_many :products end 机械地阅读,我乘机欣赏了一下Tiger里面美妙的女声,has顿一顿,and顿一顿,belongs顿一顿, to顿一顿 ,many 顿一顿,象我这样英语听力不佳者,也清清楚楚地听到产品有许多并且属于许多分类 当然,你需要建立一张连接表 create table categories_products( category_id int notnull, product_id int notnull, constraint fk_cp_category foreign key (category_id)references categories(id), constraint fk_cp_product foreign key (product_id) references products(id), primary key(category_id,product_id) ); 好了,我们的维护和1-n 没啥区别 cat 1= Caterogy.create(:name => "caterogy1") product11 = Product.create(:title => "Product 1 - 1") product12 = Product.create(:title => "Product 1 - 2") product21 = Product.create(:title => "Product 2 - 1") product22 = Product.create(:title => "Product 2 - 2") 自然,你不想一个一个来 cat1.products << [product11, product12, product21,product22] 反过来也OK cat 2= Caterogy.create(:name => "caterogy2") product11.categories << cat2 product22.categories << cat2 我们的寻找依旧,两边都行 product1.categories.find_by_name("category1") cat.products.find(:all , :conditions => ["title like ?","Product 1%"]) 展开你的想像力,回忆我们的has_many |
|
返回顶楼 | |
发表时间:2006-04-26
当然,这个实在不过瘾
很多时候,这个关系是有其它信息的,他需要有自己的模型,OK class Book < ActiveRecord::Base has_many :authorships, :dependent => true has_many :authors, :through => :authorships end class Author < ActiveRecord::Base has_many :authorships, :dependent => true has_many :books, :through => :authorships end class Authorship < ActiveRecord::Base belongs_to :book belongs_to :author end 先读一下,不要解释了吧,就是through吗 你和我有一天闲聊 you = Author.create(:name => "you") me = Author.create(:name => "me") 我们在2006年出版一本rails development的书 railsbook = Book.create(:title => "rails development", :year =>2006) 自然,我们大家要分利润的哦 Authorship.create(:book => railsbook, :author => you, :royalty => 0.3) Authorship.create(:book => railsbook, :author => me, :royalty => 0.1) 。。。。n天之后 我们来了 you , me = Author.find([1,2]) 你看看自己第一本书是啥 you.books.first.year 咱们看看2006年的第一本书的第一个作者叫什么 Book.find_by_year(2006).authors.first.name 当然,看看这本书共有几个作者 Book.find_by_year(2006).authorships.size 我当然更想看看这本书的版税 book = Book.find_by_year(2006) me.authorships.find_by_book_id(book.id).royalty 你觉得以后我们是不是该用rails聊天呢 |
|
返回顶楼 | |
发表时间:2006-04-26
potian讲述技术的方式在向whytheluckystiff靠拢 ;)
|
|
返回顶楼 | |
发表时间:2006-04-26
那这次严肃点,来个图
有的时候,某种对象可以属于不同的其它对象,这些对象之间可能没有任何关系,譬如说,你能够对某一篇Blog和Image进行评论,但是Blog和Image之间并不是继承自同一个父类,我们可以虚拟出一个“接口”,它们都是可评论的 你喜欢叫什么就什么吧 class Post < ActiveRecord::Base has_many :comments, :as => :commentable end class Image < ActiveRecord::Base has_many :comments, :as => :commentable end class Comment < ActiveRecord::Base belongs_to :commentable, :polymorphic => true end 麻烦您念一下,这里:polymorphic => true很重要,表示一个虚拟的接口 好了,回到我们的老路 Post.create(:title => "post 1") post1 = Post.find(:first) post1.comments.create(:content => "comment on post 1") post1.comments.create(:content => "comment on post 2") post.comments.find_by_content("comment on post 1") 当然,你也可以应用在Image上 image1 =Image.create(:pic => "test.png") image1.comments.create(:content => "comment on test.png") comment = Comment.find_by_content("comment on test.png") comment. commentable.pic comment = Comment.find_by_content("comment on post 1") comment. commentable.title |
|
返回顶楼 | |