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

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

浏览 39494 次
该帖已经被评为精华帖
作者 正文
   发表时间: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的时候得不到反映?
0 请登录后投票
   发表时间: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的学习难度并不大,抽空做做例子还行。狠期待实战机会
0 请登录后投票
   发表时间:2006-04-26  
http://poignantguide.net/ruby/ 

这个ruby的guide很搞啊,有人看吗.....
0 请登录后投票
   发表时间:2006-04-26  
to upstairs:
这是所有介绍程序语言的Guide里最生动的, 可以成为经典.
0 请登录后投票
   发表时间: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类似, 但除了新建的对象.
0 请登录后投票
   发表时间:2006-04-26  
kaktos 写道
http://poignantguide.net/ruby/ 

这个ruby的guide很搞啊,有人看吗.....


看过, 不过因为缺乏文化背景, 有些地方看不出幽默
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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聊天呢
0 请登录后投票
   发表时间:2006-04-26  
potian讲述技术的方式在向whytheluckystiff靠拢 ;)
0 请登录后投票
   发表时间: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
0 请登录后投票
论坛首页 编程语言技术版

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