论坛首页 Ruby版

在Rails中二个表关联取值的问题。

浏览 4016 次
精华帖 (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表时通过一条语句就知道这个用户的真实姓名呢?谢谢
   
最后更新时间: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分,又没发过精华帖。。。
   
0 请登录后投票
最后更新时间:2006-10-12
很奇怪,这个如果你认真看过任何一本rails的教程,都应该有介绍ActiveRecord的,ORM,顾名思义,这里没有字段,这里有的只是object
   
0 请登录后投票
最后更新时间: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   
在这种情况下,如何关联,如何查询呢?
   
0 请登录后投票
最后更新时间:2006-10-12
还有,因为我的B表中在一条记录中的多个字段都要关联A表中相同的字段名,我现在都不知道如何关联了,好像Rails是Convention的,所以都不知道起什么名字好了.

其实我这里不是一般应用中的的通过一个ID来关联二个表,而主要是通过B表中关联A表中的ID,然后通过这个ID来得到值.关键是还有多个字段都在同时关系A表的Code字段,一共有4个.
   
0 请登录后投票
最后更新时间: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
   
0 请登录后投票
最后更新时间: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
   
0 请登录后投票
最后更新时间: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

我从您的回复中已经可以大体知道结果了,如果有时间,请您再帮我看看.谢谢.
   
0 请登录后投票
最后更新时间:2006-10-12
俺太汗了。。你1个帖25分,4个帖41分了。。教我一下如何刷分吧~~


前面我不知道你这是地名,所以用的是user。

改成你这个表也是一样的做法,把code作id字段,from就是我上面的from_id,to就是to_id,然后使用方法跟上面相同。
   
0 请登录后投票
最后更新时间:2006-10-12
实在不好意思,首次使用,确实有点转不过弯来.在您给的例子中全是通过User查Messager的,我的确实是反过来,我都是通过Messager的From_ID和To_ID来查User中的真实Name的.所以才不太明白,我真不是混分的.
你给我写的这几个例子,我也没有跑通了,结果好像没有出来所以更迷糊了.
   
0 请登录后投票
论坛首页 Ruby版

跳转论坛:
JavaEye推荐