我应该symbolize_keys吗?

时间:2013-02-14 02:33:00

标签: ruby-on-rails rails-activerecord

1)我在HAML中抓取一些DB的记录来显示,每行的attributes方法返回一个哈希值。哈希的键是字符串。我应该把这些钥匙变成符号吗?我不确定拨打symbolize_keys是否值得。即,

%td #{app['comment']}

%td #{app[:comment]

2)我试图象征我返回的哈希数组,但它不起作用:

rows = Comment.all(:order => 'created DESC')
result = rows.each_with_object([]) do |row, comments|
   comments << row.attributes.symbolize_keys
end

是不是实际上将符号化哈希推入了注释数组?我也试过了symbolize_keys!,这没有用。我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于您使用的是Rails,因此您可以访问HashWithIndifferentAccess,因此您可以通过同时允许两者轻松绕过“字符串或符号”问题:

h = HashWithIndifferentAccess.new(some_model.attributes)
puts h['id'] # Gives you some_model.id
puts h[:id]  # Also gives you some_model.id

您的each_with_object方法:

result = rows.each_with_object([]) do |row, comments|
  comments << row.attributes.symbolize_keys
end

应该可以正常工作,所以我认为你的问题在别处。

答案 1 :(得分:1)

您是否有理由直接使用ActiveRecord::Base#attributes[your_attribute]代替ActiveRecord::Base#your_attribute?你没有提到原因。

ActiveRecord::Base会自动为您的数据库字段设置访问者:

object = Model.new
object.your_column = "foo"  # Writer
object.your_column          # Reader

您应该可以在视图中使用阅读器,而不是通过ActiveRecord::Base#attributes访问该值。

<强>更新

我不确定这是否会让你感到困惑。

Comment.find(:all)已经检索了数据库中这些行的所有列值,并将它们存储在Comment对象中(我们在下面分配给@comments)。这些值已存储在您的“评论”对象中,因此您可以根据需要在视图中使用它们。

在您的控制器中,如果您有:

def index
  @comments = Commend.find(:all)  # Fetch columns and rows.
end

您可以在HAML视图中执行此操作:

- @comments.each do |comment|     # Iterate through array of Comment objects
  %tr
    %td= comment.comment          # Use value for "comment" column.