mysql - 使用 Active Record 和 Mysql 合并 2 个表的最佳方法是什么

标签 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

最佳答案

我认为您可以将两个对象都转换为 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 中的参数覆盖,这些参数不是 nil。

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

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

在这种情况下,a 仍然是一个 Product 实例。我建议在执行此操作时在两个模型中保留相同的属性。

关于mysql - 使用 Active Record 和 Mysql 合并 2 个表的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269269/

相关文章:

Java 嵌入式数据库 h2

php - 根据 Wordpress 页面 ID 从 MySQL 数据库中检索数据

ruby-on-rails - 在 Rails link_to 中转义双引号

ruby-on-rails - 为什么我的 Rails 应用程序在控制台启动时忽略环境变量 DATABASE_URL?

php - 根据 SESSION 变量将 POST 变量插入 Mysql

MySQL join 两个独立的查询结果

css - 为什么我的 TypeKit 字体没有显示?

ruby-on-rails - 如何将 block 转发到生成方法的方法

ruby-on-rails - 将模块与 attr_accessible、has_one、has_many 混合

mysql - 如何在 has_and_belongs_to_many Rails 中创建联接表记录