【问题标题】:What is the best way to merge 2 tables with Active Record and Mysql将 2 个表与 Active Record 和 Mysql 合并的最佳方法是什么
【发布时间】:2013-11-28 15:02:06
【问题描述】:
我们需要允许用户自定义他们的实体,比如产品...所以我的意图是有一个 product 表和一个 custom_product 表,其中只包含允许用户更改的信息。
当客户访问我要合并信息的产品时,意味着我要合并两个表 - 自定义会覆盖默认的 Products 表。
我知道在 mysql 中存在一个 ifnull(a.title, b.title) 方式,但我想知道在 Rails 4 中使用 Active Record 是否有任何好的和有效的方式来解决这个问题。假设 products 和 custom products 表只有 2 列,ID 和 TITLE
【问题讨论】:
标签:
mysql
ruby-on-rails
activerecord
ruby-on-rails-4
【解决方案1】:
我认为您可以将两个对象都转换为 JSON,然后使用 merge 方法将它们的参数作为哈希处理:
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 实例。我建议在执行此操作时在两个模型中保持相同的属性。