在Rails中访问模型属性

时间:2009-08-20 10:08:01

标签: ruby-on-rails ruby model

所以基本上我有一个控制器。像这样的东西

def show
 @user = User.find[:params[id]]
 #code to show in a view
end

用户具有姓名,地址,性别等属性。如何在模型中访问这些属性?我可以为名称重载模型访问器,例如将其替换为我自己的值或将其连接到它。就像在此方法的show.html.erb视图中一样,我可能希望将用户的名称与'Mr.'连接起来或'太太'取决于性别?怎么可能?

6 个答案:

答案 0 :(得分:9)

我会毫不犹豫地覆盖属性,而是像这样添加到模型中:

def titled_name
    "#{title} #{name}"
end

但是,您可以直接访问这些字段:

def name
    "#{title} #{self[:name]}"
end

答案 1 :(得分:5)

您可以在模型中创建虚拟属性来表示这些结构。

这个主题有一个railscast但总结一下,你可以在你的模型中做这样的事情

def full_name
  [first_name, last_name].join(' ')
end

def full_name=(name)
  split = name.split(' ', 2)
  self.first_name = split.first
  self.last_name = split.last
end

如果您希望在读取或写入时显式更改属性的值,则可以使用read_attribute或write_attribute方法。 (虽然我认为这些可能会被弃用)。

这些工作通过用您自己的属性替换属性的访问器方法。例如,分支标识符字段可以输入为xxxxxx或xx-xx-xx。因此,当数据存储在数据库中时,您可以更改branch_identifier =方法以删除连字符。这可以像这样实现

def branch_identifier=(value)
  write_attribute(:branch_identifier, value.gsub(/-/, '')) unless value.blank?
end

答案 2 :(得分:0)

您可以按照建议轻松重载属性。

即。如果name是users数据库表中的字段,则可以执行以下操作:

def name
  "#{title} #{read_attribute[:name]}"
end

read_attribute函数将返回该字段的数据库列值。

警告:我不确定这是个好主意。如果你想要一个以修改的方式显示模型数据的方法,我会试图不重载默认方法,并将它们称为不同的东西 - 这将避免一定程度的混淆。

此处的文档:http://api.rubyonrails.org/classes/ActiveRecord/Base.html(在'覆盖默认访问者'下)

答案 3 :(得分:0)

如果要访问直接存储在数据库中的数据,可以在以下视图中执行此操作:

<%= @user.firstname %>
<%= @user.gender %>

如果您需要构建数据的自定义表示,那么您将需要创建帮助程序或扩展模型(如上所述)。

答案 4 :(得分:0)

我倾向于使用为模型添加到模型中的辅助方法:

def formatted_name
  "#{title} #{first_name} #{last_name}"
end

(编辑上一篇文章。回顾我的代码并实现帮助者应该仅用于与演示相关(标记)的东西。)

(再次编辑以删除剩余参数...... Geez,今天早上咖啡不够。)

(再次编辑用#替换$ ...也许我应该删除这个吧?)

答案 5 :(得分:-1)

http://api.rubyonrails.org/classes/ActionController/Base.html

中的

搜索

Overwriting default accessors