2

1)我在 HAML 中为数据库抓取一些记录以显示,每行的属性方法返回一个哈希。哈希的键是字符串。我应该把那些钥匙变成符号吗?我不确定打电话symbolize_keys是否值得。IE,

%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!了,但没有帮助。我究竟做错了什么?

4

2 回答 2

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

应该可以正常工作,所以我认为您的问题在于其他地方。

于 2013-02-14T03:09:15.813 回答
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下面分配)。这些值已经存储在您的 Comment 对象中,因此您可以随意在视图中使用它们。

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

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.
于 2013-02-14T03:15:46.777 回答