0

我正在查询一个 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
4

1 回答 1

1

您可以为您的Advertisement课程添加 2 个新方法

def total_weight
  @total_weight ||= Advertisement.sum(:weight)
end

def weight_multiplier
  self.weight.to_f / total_weight
end

然后你可以调用weight_multiplier实例上的实例Advertisement方法

于 2016-08-13T01:04:21.010 回答