找到某个外键的记录的正确方法

时间:2009-09-22 00:02:55

标签: ruby-on-rails

我有两个名为User and Membership的模型。 用户has_many:会员资格 成员资格belongs_to:user

修改MembershipsController的索引方法以将@memberships设置为用户“session [:user_id]”的所有成员资格的正确方法是什么?

我尝试过类似的东西: @memberships = Membership.find(:all,:conditions => [“user_id =?”,session [:user_id]])

但是Rails正在从用户中选择而不是成员资格:

Rendering memberships/index
  ←[4;35;1mUser Columns (3.0ms)←[0m   ←[0mSHOW FIELDS FROM `users`←[0m
  ←[4;36;1mUser Load (1.0ms)←[0m   ←[0;1mSELECT * FROM `users` WHERE (`users`.`id` = 1) LIMIT
  ←[4;35;1mCACHE (0.0ms)←[0m   ←[0mSELECT * FROM `users` WHERE (`users`.`id` = 1) LIMIT 1←[0m

2 个答案:

答案 0 :(得分:0)

未正确设置user_id。

脚本/控制台:

>> Membership.find(:first, :conditions => "user_id = 1")
=> nil

日志:

Completed in 19ms (View: 9, DB: 6) | 200 OK [http://localhost/memberships]
  [4;36;1mSQL (0.0ms)[0m   [0;1mSET NAMES 'utf8'[0m
  [4;35;1mSQL (0.0ms)[0m   [0mSET SQL_AUTO_IS_NULL=0[0m
  [4;36;1mUser Columns (2.0ms)[0m   [0;1mSHOW FIELDS FROM `users`[0m
  [4;35;1mSQL (0.0ms)[0m   [0mSHOW TABLES[0m
  [4;36;1mUser Load (0.0ms)[0m   [0;1mSELECT * FROM `users` WHERE (`users`.`id` = 1) [0m
  [4;35;1mMembership Load (1.0ms)[0m   [0mSELECT * FROM `memberships` WHERE (user_id = 1) LIMIT 1[0m
  [4;36;1mMembership Load (0.0ms)[0m   [0;1mSELECT * FROM `memberships` WHERE (user_id = 1) LIMIT 1[0m

答案 1 :(得分:0)

session[:user_id]代表什么?您是否尝试推出自己的身份验证系统?

有一个number of authentication solutions可以为你处理这些细节。

要回答你的问题,你可能想要使用你在两个模型之间设置的associations

def index
  @user = User.find(session[:user_id])
  @memberships = @user.memberships if @user
end

使用应用程序范围的身份验证系统(无论是您自己制作的还是使用库),这很可能会简化为:

def index
  @memberships = current_user.memberships
end

其中current_userApplicationController中定义的方法,它返回当前登录的用户,index操作有before_filter,确保用户已登录。