在模型对象Ruby on Rails上执行map方法

时间:2016-01-26 13:46:47

标签: ruby-on-rails ruby ruby-on-rails-4

我查询@ingredient = Feed.find(params[:ingredient_id])并返回了一个模型哈希对象,如

< Feed id: 1, ingredient: "Sorghum, Grain", cost_kg: 26.0, d_m: 88.0, c_p: 11.0, m_e: 3212.0, c_f: 2.3, e_e: 2.1, ash: 2.6, ca: nil, p:
0.32, lys: 0.22, met: 0.15, trp: 0.17, created_at: "2016-01-26 12:54:05", updated_at: "2016-01-26 12:54:05">

我想在float values的回复中对所有2进行除法。如果听起来令人毛骨悚然,请原谅我:P

我试图通过map/select组合来实现,但无法成功

3 个答案:

答案 0 :(得分:3)

您可以通过columns_hash方法获取浮动类型

致电Feed.column_hash - &gt;您可以获取所有列信息

类似的东西,(取决于您的数据库适配器)

> Reservation.columns_hash['price_amount']
=> #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007fd0ca931a78
 @array=false,
 @cast_type=
  #<ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Float:0x007fd0b235d420
   @limit=nil,
   @precision=nil,
   @scale=nil>,
 @default=nil,
 @default_function=nil,
 @name="price_amount",
 @null=true,
 @sql_type="double precision">

您可以按sql_typecast_type的班级名称获取浮动类型 所以,你可以获得浮动列

float_columns = Feed.columns_hash.select { |_k, v| v.cast_type.class.name.include? 'Float' }

并划分

feed = Feed.find(params[:ingredient_id])
float_columns.keys.each do |attr|
  feed[attr] = feed[attr] / 2 unless feed[attr].nil?
end

答案 1 :(得分:3)

尝试这种方式:

@ingredient.attributes.each do |key, value|
  if value.is_a? Float
    @ingredient[key] = value / 2
  end
end

此代码迭代@ingredient对象的属性,如果属性为Float,则将其除以2并将新属性值重新分配回@ingredient

答案 2 :(得分:1)

$(document).ready(function() {
  $("tr.slide-toggle").on("click",function() {
  $(this).find(".slide").show();
});
});

这将返回

@ingredient =    Feed.find(params[:ingredient_id]) 

@ingredient
  .attributes
  .symbolize_keys
  .delete_if { |k| [:updated_at, :created_at, :id, :ingredient].include?(k) }
  .map{ |k, v| { k => v.to_f / 2 } }