这节课我们在用户模型和微博模型的基础上,通过添加用户发布微博的功能来讲解Rails中数据关联的相关内容。其实在前面我们就试过发布第一条微博,但当时还没添加用户模型,也就是微博是没有跟用户关联。
我们要做的就是怎么讲用户和微博这两个资源关联起来,就是我们这节课要讲的数据关联。
学过数据库开发,就知道两个种类的数据关联其实就是两个数据表的关联。关联数据表的前提就是一个数据表需要有另一个数据表的某个字段,
下面是我们当前的数据:
这时候这两张表不能互相关联,怎么关联起来呢?我们想啊,一个用户可以发布多条微博,但是一个微博只能属于一个用户。这样的话我们就可以给微博数据表增加一个字段,叫user_id来唯一地表示这条微博的发布者的id,改进以后如下(用户数据表不用变,1对多字段往往是多的那张表添加):
这时候我们想知道这条微博是由谁发布的,就只要查询它的user_id字段是多少就行了。
那么与之对应的就是,我们要在后台创建微博的时候,能够自动将user_id字段添加到我们要创建的微博对象中,最后再保存到数据库。
为什么用户不用添加字段呢,比如postid来表示用户的微博?因为用户可以有很多条微博,我们无法用一个字段去标识用户的成百上千条微博。如果不给用户添加这样的字段,我们又怎么去查询用户拥有的微博呢?
其实很简单,如果用户数据表和微博数据表关联起来了,查询用户拥有的微博这一个操作其实就是一个反向查询而已,用sql语句很容易完成。
下面我们还是通过控制台添加数据库迁移文件的方式为微博数据表添加字段:
迁移文件名叫add_user_id_to_posts,user_id的数据类型直接给id类型就行(id类型就是跟String类型这般,有这种类型)
这时候rails就自动生成了对应的数据库迁移文件,这时候我们再执行数据库迁移的命令
那么久完成了添加user_id这个字段,那么只要添加这个字段是不是两个表就已经关联上了呢?前面讲过了不是,这只是数据表关联的前提条件,下面你要告诉rails这两个表是通过这个字段进行关联的。那么怎么告诉rails框架呢?就需要使用rails提供给模型的belongs_to跟has_many这两个关键词.很好理解,也就是微博模型belongs_to用户模型,用户模型has_many微博模型。数据关联关键词还有其它,不过这里用这两个就够了。
我们来到微博模型如下:
添加一行代码后如下,代码就说明Post这个模型belongs_to于user模型,也就是一个Post属于一个user(一个微博属于一个用户):
然后我们再打开user模型:
添加第2行代码,说明一个User模型拥有很多post模型(注意posts是复数形式,因为是多个post)
我们写入这两句代码,rails就会自动将两个模型中的字段关联到一起,关联字段就是user_id(也可说成是两个数据表的依赖关系一样)。
目前的工程中,我们之前发布的微博跟用户是没法再关联上了,因为它已经发布出来了。
后面要使得发布微博能跟用户关联,我们还要去修改发布微博的代码:
我们打开posts控制器,create动作里就有微博发布的代码
这个之前写的代码是用来创建用户提交过来的微博内容,还记得这些代码是通过脚手架自动生成的;
如果我们想在发布微博的时候将微博和发布微博的用户关联上,那我们就必须在创建微博的时候将微博的拥有者置为对应的用户才可以。
create中发布的用户就是填入当前已经登陆的用户。为什么呢?其实这里省略了一步就是用户登录了以后,我们才给用户去显示发布微博的这个页面,也就是不登陆是不能使用很多功能比如发布微博,这个功能的实现我们会在后面讲解。
上节课我们在讲会话的时候,当前用户的id保存到了什么变量里头?是params的session的user_id变量,这里我们就在保存post变量之前,将post的user_id字段赋值为session的user_id字段就可以了(虽然名字都叫user_id,但session里的user_id实际是对应用户模型的id字段)
添加第32行代码
这样,我们就能将新发布的微博将当前用户关联到一起了,下面我们运行看看:
先登陆,然后来到发布微博的页面
点击Log in之后如下
然后在浏览器输入路由进入发布微博页面,输入后
点击Create Post,页面就转到了微博内容的这个页面:
但是这里我们还是看不见微博是由谁发布的,这是肯定的,因为我们前端没有添加显示微博发布者的代码:
我们来到微博资源也就是posts的show页面,如下:
<%= @post.content %>虽然添加了@post的content这个字段,但是还没有创建者,那我们就在后面添加一个逗号再添加一句代码如下:
然后刷新微博内容显示页面,结果如下表明微博和微博发布者的数据关联成功:
那么看到这里微博发布用户名的取得方法吗?<%=
@post.user.userName %>
我们直接使用的是@post变量的user属性(这个属性就是关联到的user对象,然后我们可以就可以访问微博发布者即user对象的各种属性比如userName),重点在于也就是微博属于的用户对象我们可以直接拿到(当然这个工作是由rails自动帮我们完成的)
?
原文:http://www.cnblogs.com/blueColdFire/p/5199631.html