为什么当我执行@ user.email时它返回null,但是@user [:email]运行良好?

时间:2012-11-17 03:25:23

标签: ruby-on-rails ruby

我是红宝石初学者,这是我的代码:

@user = User.find_by_username('myname', :select => 'users.email')
email = @user.email

为什么变量“email”会返回null值?但是当我使用以下代码时,它会返回正确的结果。

email = @user[:email]
顺便说一下,即使我删除了:选择,问题仍然存在,这太奇怪了。

对象似乎没有问题,这是我使用@user.to_yaml

时的结果
--- !ruby/object:User
attributes:
  email: xxx@gmail.com

4 个答案:

答案 0 :(得分:1)

看起来你正在用:select => 'users.email'选择对象的一部分,它会被转换成一些特殊的近似模型。试着这样做:

@user = User.find_by_username('myname')
email = @user.email

另外,您使用的是什么版本的Rails?我在Rails 3.2.8项目中运行你的语句,@user.email为我工作

答案 1 :(得分:1)

您应该以这种方式写下您的请求:

@user = User.select(:email).find_by_username('myname')
email = @user.email

这是使用ActiveRecord形成查询的常用方法。

答案 2 :(得分:1)

我尝试过多项内容(覆盖email方法,将其从attr_accessible删除,从schema.rb删除电子邮件列),但它始终有效。

我们通过对该问题的评论找到了答案,attr_accessor就是问题所在。

总结一下:永远不要将attr_accessor用于Model属性!

答案 3 :(得分:0)

嗯,看看你的例子,我会说这是因为你指定了一个选择。

我猜测为什么[]而不是方法访问​​器是因为使用select它可以检索没有为模型定义的值,比如一些聚合的计数,所以我想如果在某些情况下使用select的访问器方法没定义?但是,这很奇怪!