如何在现有模型上设置虚拟属性?

How do I set a virtual attribute on an existing model?

所以我有一个 User 模型,它有一个 first_namelast_name 列。

我想创建一个名为 username 的新虚拟属性,我什至可以在我的路由文件中访问它。

我试过这样做:

attr_accessor :username 

  # getter
  def username
    @username
  end

  # setter
  def username=(user)
    @username = "#{user.first_name}.#{user.last_name}"
  end

但是当我尝试设置它时,我得到了一个错误的参数数量错误。

[27] pry(main)> u.username=(u)
ArgumentError: wrong number of arguments (1 for 0)
from     
[28] pry(main)> u.username = u
ArgumentError: wrong number of arguments (1 for 0)
from 

u 是有效的 User 记录。

理想情况下,我想做两件事。我希望能够检查我的数据库中所有 User 对象的 user.username,它应该按照上述 setter 方法 return。

我怎样才能做到这一点?

我想,你在其他地方有问题。在没有看到代码的情况下很难找出代码出了什么问题,但是这段代码本身可以正常运行:

class User < ActiveRecord::Base
  def username=(value)
    @username = value
  end

  def username
    @username
  end
end

user = User.new(:first_name => "Bill", :last_name => "Gates")
user.username = "billgates"
user.username

或者您可以使用attr_accessor来代替getter和setter的手动定义:

class User < ActiveRecord::Base
  attr_accessor :username
end

看一下这个截屏视频以澄清事情:http://railscasts.com/episodes/16-virtual-attributes