从 ruby 中的 ActiveRecord 对象创建嵌套哈希
Creating a nested hash from ActiveRecord object in ruby
require "active_record"
ActiveRecord::Base.establish_connection(
:adapter => 'mysql2',
:database => '<db_name>',
:username => '<username>',
:password => '<password>',
:host => 'localhost')
ActiveRecord::Base.pluralize_table_names = false
class Location < ActiveRecord::Base
has_many :location_channels
has_many :channels, :through => :location_channels
end
class Channel < ActiveRecord::Base
has_many :location_channels
has_many :locations, :through => :location_channels
end
class LocationChannel < ActiveRecord::Base
belongs_to :location
belongs_to :channel
end
locations = Location.all
hash = {} # hash initialization
locations.each do |location|
hash["location"] = location[:name]
puts "#{location[:name]} has #{location.channels.size} channels:"
location.channels.each do |channel|
puts "--> #{channel[:name]}"
end
puts
end
puts hash
最终目标是创建一个JSON
文件.
所以我决定从 Hash object
创建 JSON
会更容易。
如上面的代码所示,我可以通过名为 LocationChannel
class 的 JOIN table 访问嵌套文档,并且我正在尝试弄清楚如何创建一个 Hash object
会是什么样子:
{
["location" => "A", "channels" => {"1","2","3"}],
["location" => "B", "channels" => {"1","2"}],
["location" => "C", "channels" => {"4","5","6"}]
}
其中 "A"
、"B"
和 "C"
- 位置名称和 "1"
、"2"
等 - 表示频道名称。
并且当前代码仅打印出最后一条记录,如:
{"location"=>"A"}
如果上面的示例有误,请纠正我 Hash 应该是什么样子。
更新 1
感谢@jonsnow 指出哈希格式。
哈希格式应为:
{ :locations =>
[
{ name: a, channels: [1,2,3]},
{ name: b, channels: [1,2]},
{ name: c, channels: [4,5,6]}
]
}
更新哈希的解决方案,
hash = { locations: [] } # hash initialization
locations.each do |location|
hash[:locations] << { name: location.name,
channels: location.channels.pluck(:name) }
end
require "active_record"
ActiveRecord::Base.establish_connection(
:adapter => 'mysql2',
:database => '<db_name>',
:username => '<username>',
:password => '<password>',
:host => 'localhost')
ActiveRecord::Base.pluralize_table_names = false
class Location < ActiveRecord::Base
has_many :location_channels
has_many :channels, :through => :location_channels
end
class Channel < ActiveRecord::Base
has_many :location_channels
has_many :locations, :through => :location_channels
end
class LocationChannel < ActiveRecord::Base
belongs_to :location
belongs_to :channel
end
locations = Location.all
hash = {} # hash initialization
locations.each do |location|
hash["location"] = location[:name]
puts "#{location[:name]} has #{location.channels.size} channels:"
location.channels.each do |channel|
puts "--> #{channel[:name]}"
end
puts
end
puts hash
最终目标是创建一个JSON
文件.
所以我决定从 Hash object
创建 JSON
会更容易。
如上面的代码所示,我可以通过名为 LocationChannel
class 的 JOIN table 访问嵌套文档,并且我正在尝试弄清楚如何创建一个 Hash object
会是什么样子:
{
["location" => "A", "channels" => {"1","2","3"}],
["location" => "B", "channels" => {"1","2"}],
["location" => "C", "channels" => {"4","5","6"}]
}
其中 "A"
、"B"
和 "C"
- 位置名称和 "1"
、"2"
等 - 表示频道名称。
并且当前代码仅打印出最后一条记录,如:
{"location"=>"A"}
如果上面的示例有误,请纠正我 Hash 应该是什么样子。
更新 1
感谢@jonsnow 指出哈希格式。
哈希格式应为:
{ :locations =>
[
{ name: a, channels: [1,2,3]},
{ name: b, channels: [1,2]},
{ name: c, channels: [4,5,6]}
]
}
更新哈希的解决方案,
hash = { locations: [] } # hash initialization
locations.each do |location|
hash[:locations] << { name: location.name,
channels: location.channels.pluck(:name) }
end