1

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

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

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

email = @user[:email]

顺便说一句,即使我删除了:select,问题仍然存在,这太奇怪了。

该对象似乎没有问题,这是我使用时的结果@user.to_yaml

--- !ruby/object:User
attributes:
  email: xxx@gmail.com
4

4 回答 4

1

看起来您只是选择了对象的一部分,:select => 'users.email'并且它正在转换为一些特殊的几乎模型。尝试这样做:

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

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

于 2012-11-17T03:42:18.647 回答
1

你应该这样写你的请求:

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

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

于 2012-11-17T08:45:09.963 回答
1

我已经尝试了几件事(覆盖该email方法,将其从中删除,从attr_accessible中删除电子邮件列schema.rb),但它始终可以正常工作。

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

总结一下:永远不要使用attr_accessor你的Model属性!

于 2012-11-17T14:11:46.597 回答
0

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

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

于 2012-11-17T03:34:07.413 回答