我希望能够从另一个集合中获取id,并将其用作哈希的键。然后我希望能够为每个属性应用各种属性。它会是这样的:
@books = Hash.new
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"
或其他相似之处。这有可能通过一些调整来实现吗?
谢谢你的时间!
编辑:我应该补充一点,在这种情况下创建一个Class是不可取的,尽管我最终可能不得不这样做。
答案 0 :(得分:3)
如果您想要完全符合该语法,则可以创建OpenStruct
s的散列:
require 'ostruct'
@books = Hash.new { |h, k| h[k] = OpenStruct.new }
key = 1
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"
@books #=> {1=>#<OpenStruct title="A Title", condition="Poor", rating="Excellent">}
答案 1 :(得分:2)
你可以使用多维哈希?
@books = Book.all
@books_hash = {}
@books.each do |book|
@books_hash[book.id] = {}
@books_hash[book.id][:title] = book.title
@books_hash[book.id][:rating] = book.rating
end
答案 2 :(得分:1)
你可能永远不想这样做,只是为了回答这个问题。
这是否可以通过一些调整来实现?
是的,我们可以创建自己的类来轻松完成这项工作。
class MyAnonObject
attr_accessor attributes
def attributes
@attributes ||= {}
end
def method_missing method, *args, &block
if method =~ /^(\w+)=$/
@attributes[$1] = args[0]
else
@attributes[$1]
end
end
end
然后我们可以修改你的例子来使用这个新类。
@books = Hash.new { MyAnonObject.new }
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"
话虽如此,我不推荐这个解决方案。阅读可能会让人感到困惑。但是,有可能=)实际上,这只是一个带有奇怪语义的多维哈希。
答案 3 :(得分:0)
您可以制作Book类型的对象。
class Book
attr_accessor :tilte, :rating, :condition
end
然后修改您的示例以使用新的Book类。
@books = Hash.new
@books[key] = Book.new
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"
答案 4 :(得分:0)
类似于deaththreetimes anser,但Book.new由Hash完成:
class Book
attr_accessor :title
attr_accessor :condition
attr_accessor :rating
def initialize()
@undefined_values = {}
end
def method_missing ( m, *args )
@undefined_values[m] = args
end
def inspect()
"Book #{@title} (#{@condition}, #{@rating}, #{@undefined_values.inspect})"
end
end
@books = Hash.new{ |hash,k| hash[k] = Book.new
}
key = :xx
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"
@books[key].isbn = "123456"
p @books[key] #-> Book A Title (Poor, Excellent, {:isbn==>["123456"]})
编辑:添加了处理未定义值的代码。 p @books [key]