0

我已经开始使用 ActiveRecord 来访问我的数据库,它非常有用。然而,访问对象内部的数据ActiveRecord::Relation似乎是一个挑战。我使用以下方法查询我的数据库:

post '/login' do
    session.clear
    r = User.where(:username => params["user"], :password => Digest::MD5.hexdigest(params["pass"]))
    if r.count == 1 
        session[:user] = r
        session[:user].delete(:password)
        status 200
    else
        status 401
    end
end 

使用返回的数据,Ruby 会检查以确保有一行,如果有,则将r对象的内容设置为 hash session[:user]。然后,理想情况下,它应该从对象中删除密码数据,session[:user]以便它只提供识别用户的详细信息。但是,使用此代码,我得到错误:wrong number of arguments (1 for 0)指向.delete行。那么,如何从该对象中删除密码数据,或将其转换为哈希,因为我知道我可以删除哈希格式的密码。

4

3 回答 3

0

ActiveRecord 查询返回一个关系,而不是一个数组或一个对象 - 认为select,collectsession[:user] = User.all.select{|u| u.id == 1}真的没有意义,不是吗?

所以,就像上面说的:

User.where(:id => 1).class == ActiveRecord::Relation 

尽管

User.find(1).class == User

这样做是为了当您链接查询时,ActiveRecord 可以将它们转换为一个 SQL 查询,而不是获取很多很多记录,将它们转换为 Ruby 对象,然后在它们上运行 Ruby 命令。

举一个非常简单的例子:

$ User.where(:id => 1).count
   (0.5ms)  SELECT COUNT(*) FROM "users" WHERE "users"."id" = 1
=> 1

相对:

$ User.where(:id => 1).all.count
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1
=> 1

.all会将 ActiveRecord::Relation 转换为 Ruby 对象数组,在这种情况下,User

然后你可以做

User.find(1).update_attributes(:name => "Joseph")

user = User.find(1)
user.name = "Jack"
user.save

因为它是一个 Ruby 对象。

于 2013-06-02T21:14:59.260 回答
0

session在重新识别用户时,我通常只使用在对象中存储一个不易被篡改的唯一属性(在 Rails 中,会话存储在一个现已签名和加密的 cookie 中)。数据量通常在会话存储中受到限制。

为此,在我的用户表中添加一个,每次用户登录时token都会重新生成该表并存储在会话中。通常(在 PostgreSQL 上)我会定义这个 type 列,但你也可以使用 a或类似的。uuidVARCHAR(128)

如果用户现在返回,我只需发出

@current_user = User.where(token: session['user_token']).first

当用户注销时,我只是取消用户的token

@current_user.update_attribute :token, nil
session.clear
于 2013-06-02T16:42:10.883 回答
0

您在关系上调用删除,而不是在哈希或用户中。

正如@sunny1304 所说,您可以选择要从数据库中获取的字段,而且您必须调用#first 才能仅检索一个条目。

r = User.where(:username => params["user"], :password => Digest::MD5.hexdigest(params["pass"])).select(:id, :username, :other_attrs).first

无论如何,您不应该将所有用户数据存储在会话中。您应该只保存 id,并且可能保存一些不会更改的内容(例如,如果用户名存在于您的应用程序中)。并查询每个请求的用户数据。

于 2013-06-02T16:26:22.527 回答