ruby-on-rails 我应该用钥匙来象征吗?

ktecyv1j  于 2023-01-03  发布在  Ruby
关注(0)|答案(3)|浏览(58)

1)我正在用HAML抓取一些数据库记录来显示,每行的attributes方法返回一个hash。hash的键是字符串。我应该把这些键转换成符号吗?我不确定调用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!,但没有帮助。我做错了什么?

omhiaaxx

omhiaaxx1#

由于您使用的是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

应该工作得很好,所以我认为你的问题出在别的地方。

mqkwyuun

mqkwyuun2#

你有直接使用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)已经为数据库中的这些行检索了 * all * columns值,并将它们存储在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.
izkcnapc

izkcnapc3#

你可以添加hook,它在模型加载后象征键:

class YourModel < ApplicationRecord
  after_initialize do |rec|
    attributes["some_json_field"].symbolize_keys! if attributes.key? "some_json_field"
  end
end

相关问题