|
锁定老贴子 主题:在Rails中二个表关联取值的问题。
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2006-10-11
有一个问题,我一直没有解决。比如有二个表A,B。
A表中有ID,代表了用户的ID B表中有User_ID,关联于A表的ID 当我查询B表时,我只能得到User_ID,但知道这个ID还要再进行二次查询才可以知道这个ID代表的用户的真实名字。在Rails的ORM里,有没有办法,可以让我在查询B表时通过一条语句就知道这个用户的真实姓名呢?谢谢 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2006-10-11
这个是基础了,随便找个教程就会有的。
class User < ActiveRecord::Base has_many :posts end class Post < ActiveRecord::Base belongs_to :user end post = Post.find(1) puts post.user.name # 这会发送2条SQL查询语句,下面这个只发送一条: post = Post.find(1, :include => :user) puts post.user.name ----------------------------- 为什么你只发了一帖就有35分?刚才一位才发了2帖就有100分,又没发过精华帖。。。 |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
很奇怪,这个如果你认真看过任何一本rails的教程,都应该有介绍ActiveRecord的,ORM,顾名思义,这里没有字段,这里有的只是object
|
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
谢谢qiezi ,我可能是老会员了,照顾一下多给了一些分,哈哈.
我的表可能现在还要复杂的多,我再请教一下! A表里全部都是一些键和键值. 结构如下: Code Value 1 SD 2 BJ 3 SH B表可能在一条记录的不同字段里关联了多个Code的Key B表结构如下: From(对应一个A表中的Code) To(对应一个A表中的Code) 1 2 2 3 3 1 这时,我如果查询B表,得到的也全是ID 在这种情况下,如何关联,如何查询呢? |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
还有,因为我的B表中在一条记录中的多个字段都要关联A表中相同的字段名,我现在都不知道如何关联了,好像Rails是Convention的,所以都不知道起什么名字好了.
其实我这里不是一般应用中的的通过一个ID来关联二个表,而主要是通过B表中关联A表中的ID,然后通过这个ID来得到值.关键是还有多个字段都在同时关系A表的Code字段,一共有4个. |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
jerry 写道 谢谢qiezi ,我可能是老会员了,照顾一下多给了一些分,哈哈.
我的表可能现在还要复杂的多,我再请教一下! A表里全部都是一些键和键值. 结构如下: Code Value 1 SD 2 BJ 3 SH B表可能在一条记录的不同字段里关联了多个Code的Key B表结构如下: From(对应一个A表中的Code) To(对应一个A表中的Code) 1 2 2 3 3 1 这时,我如果查询B表,得到的也全是ID 在这种情况下,如何关联,如何查询呢? 如果B表只有这2个键,也般就是多对多关系,就在A表的model类中使用has_and_belongs_to_many。
create table users (
id serial not null primary key
);
create table messages (
from_id integer not null references users(id),
to_id integer not null references users(id)
);
class User < ActiveRecord::Base
has_and_belongs_to_many :to_users, :class_name => 'User',
:foreign_key => 'from_id',
:association_foreign_key => 'to_id',
:join_table => 'messages'
has_and_belongs_to_many :from_users, :class_name => 'User',
:foreign_key => 'to_id',
:association_foreign_key => 'from_id',
:join_table => 'messages'
end
这个例子用这种模式看着别扭,不过只是大致演示一下使用方法。使用:
User.find(1).to_users
User.find(1).from_users
如果B表还有其它数据,就为B也添加一个model类,在A表中使用2个has_many,再添加2个has_many_through。 create table users ( id serial not null primary key ); create table messages ( id serial not null primary key, from_id integer not null references users(id), to_id integer not null references users(id), body text ); class Message < ActiveRecord::Base belongs_to :from, :class_name => 'User', :foreign_key => 'from_id' belongs_to :to, :class_name => 'User', :foreign_key => 'to_id' end class User < ActiveRecord::Base has_many :in_messages, :class_name => 'Message', :foreign_key => 'to_id' has_many :out_messages, :class_name => 'Message', :foreign_key => 'from_id' end 使用: u = User.find(1) u.in_messages u.out_messages |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
上面这最后一段还少一点,这个代码显示也乱,再跟一帖了。。
你想收集message.user,除了User.find(1).out_messages.map(&:to)以外,还可以使用has_many through: class User < ActiveRecord::Base has_many :in_messages, :class_name => 'Message', :foreign_key => 'to_id' has_many :out_messages, :class_name => 'Message', :foreign_key => 'from_id' has_many :receivers, :through => :out_messages, :source => :to end 使用: User.find(1).receivers |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
谢谢qiezi,这一次我又学到东西,不过这一次可能我写的不清楚,引起你理解有误Sorry.
其实我这二个表,A表是全国省市的一个Key--Value表.B表是一个说明从哪儿到哪儿的表.比如B表是旅游路线的,我从北京到山东,从上海到北京.但B表里只存了A表中这些省,市的ID,当我查询B时表,我要得到这些ID对应的真实的省市的名字. A结构如下: Code Value 1 SD山东 2 BJ北京 3 SH上海 B表可能在一条记录的不同字段里关联了多个Code的Key B表结构如下: From(对应一个A表中的Code) To(对应一个A表中的Code) 1 2 2 3 3 1 我从您的回复中已经可以大体知道结果了,如果有时间,请您再帮我看看.谢谢. |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
俺太汗了。。你1个帖25分,4个帖41分了。。教我一下如何刷分吧~~
前面我不知道你这是地名,所以用的是user。 改成你这个表也是一样的做法,把code作id字段,from就是我上面的from_id,to就是to_id,然后使用方法跟上面相同。 |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-12
实在不好意思,首次使用,确实有点转不过弯来.在您给的例子中全是通过User查Messager的,我的确实是反过来,我都是通过Messager的From_ID和To_ID来查User中的真实Name的.所以才不太明白,我真不是混分的.
你给我写的这几个例子,我也没有跑通了,结果好像没有出来 |
|
| 返回顶楼 | |








