我正在查询一个 mysql 数据库并返回一个由连接创建的对象数组。据我了解,ActiveRecord 选择命令返回一个新对象数组,每个对象都具有连接中两个表的属性。
我想对这些对象中的每一个执行一些计算,并将一些属性与对象相关联。我知道如果这是我的课,我可以使用这里看到的 method_missing 方法。但是,由于该对象是由 select 命令创建的,因此我没有可以定义该add_attrs
函数的类代码。这可能吗?是否使用 method_missing 正确的方法,如果是,我该如何实施?
这是返回 ActiveRecord 对象数组的初始查询。
def self.select_with_location
select("advertisements.id, advertisements.weight, locations.latitude, locations.longitude")
end
如果我去 ruby 控制台并输入命令
advertisements = Advertisement.joins(:locations).select_with_location
puts advertisements[0].inspect
我应该得到类似的东西:
{id: 0, weight: 5, locations.latitude: 49.03030, locations.longitude: 50.5050}
现在,我想要的是遍历广告并对每个权重进行计算。我想将该计算的结果存储到我想调用的广告的新属性中weight_multiplier
。在这个计算之后,如果我去 ruby 控制台并输入以下命令:
puts advertisements[0].inspect
我想得到结果
{id:0, weight: 5, locations.latitude: 49.03030, locations.longitude: 50.5050, weight_multiplier: 0.446003}
在此示例中,数字本身并不重要,我只想将 weight_multiplier 属性添加到数组中的每个广告。
我知道下面的代码是不正确的,但这是该函数将要做什么的要点:
def self.assign_weight_multiplier advertisements
totalWeights = advertisements.inject(0){|sum,advertisement| sum + advertisement.weight }
advertisements.each do |advertisement|
advertisement.weight_multiplier = (Float(advertisement.weight)/Float(totalWeights))
end
advertisements
end