将2个表与Active Record和Mysql合并的最佳方法是什么

时间:2013-11-28 15:02:06

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

我们需要允许用户自定义他们的实体,例如产品...所以我的目的是拥有一个产品表和一个custom_product表,其中只包含允许用户更改的信息。

当客户端转到产品我要合并信息时,意味着我要合并两个表 - 自定义覆盖默认的Products表。

我知道在mysql中存在一种ifnull(a.title,b.title)方式,但我想知道是否有任何一种好的有效方法可以在Rails 4中使用Active Record解决这个问题。假设产品和定制产品表只有2列,ID和TITLE

1 个答案:

答案 0 :(得分:1)

我认为您可以将两个对象转换为JSON,然后使用merge方法将其params作为哈希处理:

class Product
end

class Customization
  belongs_to :product
end


a = Product.find(...)
b = a.customization

c = JSON(a.to_json).merge(JSON(b.to_json).reject!{|k,v| v.nil?})

因此,c将包含来自Product的所有参数,这些参数最终被Customization中不为零的那些所覆盖。

如果您仍想使用具有混合值的Product对象(取自Customization),您可以尝试:

a.attributes = a.attributes.merge(b.attributes.reject!{|k,v| v.nil?})

在这种情况下,a仍然是Product个实例。我建议在这两个模型中保持相同的属性。