新手问题 一个比较典型多对多关联查询以及相关的问题请教

yaoge · 2013年08月23日 · 最后由 cisolarix 回复于 2014年04月09日 · 3481 次阅读

结构如下

class User < ActiveRecord::Base
has_many :team_user_ships,:dependent => :delete_all
has_many :teams,:through => :team_user_ships

end

class Team < ActiveRecord::Base
has_many :team_user_ships,:dependent => :delete_all
has_many :users,:through => :team_user_ships

end

# Table name: team_user_ships
#  team_id    :integer
#  user_id    :integer
#  role       :integer
#  created_at :datetime         not null
#  updated_at :datetime         not null
#  id         :integer          not null, primary key
#  status     :integer
class TeamUserShip < ActiveRecord::Base
belongs_to :user
belongs_to :team

end

中间表中有两个非 ID 字段 role,status

在学习 rails 多对多的过程中想到一下几个需求,不知道 rails 下怎么很好的处理,可能是之前用其他语言留下的后遗症,总觉得还有更合理或高效的解决方法

1、当 Urser 要登录的时候同时也选择了登录的团队信息,大家一般用什么方法取得中间表的非 ID 字段 role 和 status,如果中间表没有主键 ID 又是怎么取的?

2、当需要在 View 中列出指定 Team 中的所有 User 时也要显示出用户的 role 和 status,这样的需求,又怎么处理?在 view 中 each 时一个一个查询吗?

3、

@T=User.find_by_sql("select * from users u,team_user_ships s where u.id = s.user_id and s.team_id=xxxx")
puts @T.class
->Array  
puts @T[0].class  
->User
puts @T[0].role
->1
puts @T[0].status
->2

这时我对需求 2 的做法,可是不明白的是,@T[0] 明明是一个 User 类实例,而 User 中并没有 role 和 status 这两个属性或者方法,这个查询出来的@T[0].status 和@T[0].role 又是什么个情况,如果直接在控制台输出@T[0] 的到的结果中也是没有 status,role 的;另外这个时候同时查询出来了 2 个 ID 又是如何处理的呢?

@T[0].status 和 @T[0].role 是 method call 啊,Rails 给你变出来的 method

中间的那个模型完全可以叫 MemberShip。

1、当 User 要登录的时候同时也选择了登录的团队信息,大家一般用什么方法取得中间表的非 ID 字段 role 和 status,如果中间表没有主键 ID 又是怎么取的?

<% @user.memberships.each do |membership| %>
  <%= "#{membership.role} #{membership.status}" %>
<% end %>

有主键。

2、当需要在 View 中列出指定 Team 中的所有 User 时也要显示出用户的 role 和 status,这样的需求,又怎么处理?在 view 中 each 时一个一个查询吗?

<% @team.memberships.each do |membership| %>
  <%= "#{membership.role} #{membership.status} #{membership.user.name}" %>
<% end %>

这是我的理解,不对的请指正。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号