我是红宝石初学者,这是我的代码:
@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
答案 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的访问器方法没定义?但是,这很奇怪!