创建Rails模型类间的关系
引用
Contributed by Brian Leonard, maintained by Gail Chappell
October 2007 [Revision number: V6.0-2]
这篇教程讲述NetBeans Ruby onRails的项目中怎样在模型间建立(一对一和一对多)关系。
内容:
- 教程的先决条件
- 创建简单的数据库
- 创建评论(comment)模型类
- 迁移数据库
- 定义一种评论(comment)模型类和帖子(post)模型类之间的关系
- 修改控制器脚手架
- 修改视图以显示各种评论
- 显示各种评论(comments)
教程的先决条件
这篇教程需要以下技术和资源:
创建简单的数据库
这篇教程是以《10分钟创建Ruby网络日志》为前提的。如果你已经完成那篇教程,你可以把那篇教程完成的项目作为起点并直接进入到下一部分。如果你没阅读那个教程,就下载RubyWeblog.zip文件,并且跟着那些步骤来创建简单的数据库。
注意:本教程使用MySQL数据库服务器。参阅《安装配置Ruby支持》获得在Ruby应用中使用MySQL数据库服务器的相关信息。但这个文档也包含了有关怎样使用JavaDB数据库服务器的技巧。
1.打开命令行窗口。
2.如果这时还没有开启MySQL数据库服务器,将它开启。
3.输入下面的命令来创建开发数据库,然后按回车键。
mysqladmin -u root -p create rubyweblog_development
注意:如果根用户不要求密码,就省略-p这个参数。
4、在IDE中打开RubyWebLog项目。
注意:当你第一次在IDE中开启或创建Ruby项目时,IDE会检查除已绑定的JRuby软件外你是否还没其它的Ruby安装件。如果有,IDE会出现一个对话框来询问你要用哪个软件。如果你想用已绑定的JRuby解释器,就选择JRuby,或者如果想用你喜欢的Ruby安装件,那就选择你的安装件。想获得更多的信
息,请参阅安装与配置的Ruby教程中的《用你自己的Ruby安装件来配置IDE》。
5、如果你的数据库要求密码,编辑database.yml文件,并在在development配置下提供password。然后保存这个文件。
为了快速存取这个database.yml文件,可以按快捷键Alt+Shift+O(苹果操作系统用Ctrl+Shift+O),在文件名正文框中输入database.yml,然后按回车键。
6、右击RubyWebLog节点,并选择MigrateDatabase) > ToCurrent Version。
这个动作更新了含有数据库posts表,并加入一个body字段。在Output窗口中显示迁移完成。
创建评论模型类
通过使读者给一个日志帖子(post)添加各种评论(comments),这篇教程增进了RubyWeblog项目。你可以通过建立这个评论模型类来存储读者的各种评论实例来开始。这个项目已经有一个帖子(Post)模型类,用来存储各种博客帖子实例。
1.在Project窗口,如果RubyWebLog节点没有被展开,就展开它,并右击Model节点,然后选择Generate。
2.在Arguments栏中输入Comment,并点击OK.。
这个Rails生成器会生成一个叫Comment的模型类,这个模型类包括以下各文件:
[*]app/models/comment.rb。一个持有评论(Comment)模型类的方法的文件。这个文件也在编辑区中打开。[*]test/unit/comment_test.rb。.一个检测评论(Comment)模型类的单元测试。[*]test/fixtures/comments.yml。一个用来增加模型类测试套件(fixture)。[*]db/migrate/migrate/003_create_comments.rb。一个修改数据库结构的迁移文件。这个文件的版本是003,因为这个项目在此之前已经有2个迁移文件了,即001_create_posts.rb和002_add_body.rb,他们用来创建和修改posts表。
迁移数据库
在迁移文件中添加信息,这样读者的每个评论实例除了自动创建的id栏目以外,还有这个帖子的父帖子id,创建的时间和一个文本描述。
1. 在输出窗口中,点击003_create_comments.rb文件的链接,在编辑区中打开这个文件。
2.在self.up方法中,把以下代码(粗体显示)添加到create_table:
代码示例1:self.up 方法
class CreateComments < ActiveRecord::Migration
def self.up
create_table :comments do |t|
t.column 'post_id', :integer
t.column 'created_at', :datetime
t.column 'comment', :text
end
end
def self.down
drop_table :comments
end
end
这个迁移建立了一个有4个字段的评论数据库表:id,含有一个整型数(integer),post_id,含有一个整型数(integer);created_at,存储日期和时间;还有comment,含有一个正本描述。
3.选择File>SaveAll。
4.右击RubyWebLog节点,并选择MigrateDatabase > ToCurrentVersion。这动作更新包含评论表数据库。在Output窗口中显示迁移完成。
定义帖子(post)与评论(comment)模型类间的关系
现在这个应用程序中有两个模型:用来创建新日志帖的帖子(post)模型类和向日志贴添加评论的评论(comment)模型类。你要定义两个模型间的关系,这样使一个评论和一个单一的帖子相关联,并且一个贴子可以有多个评论。
1.展开模型节点,,并打开post.rb。
2.在post.rb中添加一下的has_many关联。
代码示例2:has_many 与post.rb关联
class Post < ActiveRecord::Base
has_many :comments
end
这个has_many方法表示帖子可以和零个,一个或多个的评论记录相关联。
3.打开Models >comment.rb,并且添加belongs_to关联:
代码示例3:belongs_to与comment.rb的关联
class Comment < ActiveRecord::Base
belongs_to :post
end
这个belongs_to方法表示一个评论只可以和一个帖子相关联。默认时,ActiveRecord使用这个post_id把一个评论和那个含有相应post.id的帖子相关联。
修改控制器脚手架
下一步是要修改控制器,blog_controller.rb,它在这个日志帖中为创建,读入,更新和删除日志贴中的实体,生成脚手架或基本的接口。
1.双击Controllers >blog_controller.rb,在编辑区打开blog_controller.rb文件。
这个控制器含有所有的脚手架行为,包括index,list, show, new, create, edit, update, 和destroy。
2.修改show行为,然后将post_id保存在flash中,如下面的代码所示:
代码样本4:show 行为
def show
@post = Post.find(params[:id])
flash[:post_id] = @post.id
end
这段代码找到与请求传来的id参数相关联的帖子,然后将id存在flash中备用。flash与HTTP会话相似,但它只限于一个请求。当你将数据放入这个flash中,它就可以在下个请求中被使用,然后就消失了(因此叫做flash)。
3.将鼠标滚到blog_controller.rb文件的结尾,并在最后面的end语句之前加入下面的post_comment行为:
代码示例5:post_comment 行为
def post_comment
@comment = Comment.new(
\"post_id\" => flash[:post_id],
\"created_at\" => Time.now,
\"comment\" => params[:comment]['comment']
)
if @comment.save
flash[:notice] = 'Comment was successfully added.'
redirect_to :action => 'show', :id => flash[:post_id]
end
end
当用户点击Post按钮提交评论时就调用post_comment行为。这段代码的第一块是从flash中获得post_id(像1、2、等),并且用它找出与这个id相关联的博客帖子。然后代码创建了一个新的评论comment)对象与这个post_id相关联,也就是由创建时间和实际评论(comment)组成。Rails框架把从这个页面提交的各参数作为一个散列(params[:comment])来传递,这个散列来自于该代码取出的评论参数(params[:comment]['comment'])。
Comment是一个ActiveRecord类,所以调用它的save方法将评论的记录保存到数据库中。然后消息放在flash中。该代码调用show行为,这个行为加载show.rhtml页面。这个页面重新加载这个日志和它的所有评论,包括刚刚新加的那个。
修改视图以显示评论(comment)
编辑显示单独的日志项show.rhtml文件。
1.展开Views >blog并打开show.rhtml
2.在show.rhtml的结尾添加下面的代码:
代码示例6: show.rhtml代码
<hr>
<h4>Comments</h4>
<% form_tag :action => 'post_comment' do %>
<p><label for=\"comment_comment\">Comment</label><br/>
<%= text_area 'comment', 'comment' %></p>
<%= submit_tag \"Post\" %>
<%end %>
这段代码生成一个表单(form)),包括用来写评论的文本域和一个标着Post的提交按钮,如图1所示。表单提交时调用post_comment行为。
3、保存文件然后运行应用程序。如果没有帖子,创建一个新的帖子。
4、点击Permalink查看博客项的细节。试着在文本域中加入评论,但是记住在你点Post按钮时博客还不能显示评论。
如果你发表成功,会看到视图顶部的消息,如下图所示。在下几步中,你就添加代码来收集并显示评论。
图1:没有评论的评论模型视图
[attachment=400]
显示评论(comment)
日志目前还不能显示读者添加的评论,所以你现在要解决这个问题。
1.在blog_controller.rb中找到show行为,并插入下面的post_comments实例变量来收集所有评论:
代码示例7:blog_controller.rb的代码
def show
@post = Post.find(params[:id])
@post_comments = @post.comments.collect
flash[:post_id] = @post.id
end
2.通过在Comments
行的后面复制粘贴标签来修改show.rhtml
代码示例8:show.rhtml代码 <ul>
<% for comment in @post_comments %>
<li><%= comment.comment %><br>
<div style=\"color=: #999; font-size: 8pt\">
Posted on <%= comment.created_at.strftime(\"%B %d, %Y at %I:%M %p\") %>
</div>
</li>
<% end %>
</ul>
这段代码为评论设置了格式并将它们显示在带有黑点的列表中,并包括评论发表的日期和时间。
3、选择File > SaveAll,然后刷新浏览器。
评论现在出现在日志的bulleted列表中,如下图所示:
图2: 有评论的评论模型的视图
[attachment=401]
下几步
[*]要提交你自己的NetBeansRuby教程,访问NetBeansCommunity Docs页面。
[
本帖最后由 maninred 于 2007-11-8 05:29 编辑 ]