首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中存储JSON数据

在mysql中存储JSON数据
EN

Stack Overflow用户
提问于 2012-04-26 16:14:06
回答 3查看 12.6K关注 0票数 9

例如,我有一个组织表

代码语言:javascript
复制
ID, name, address, phone, email, etc...

现在我想添加多个地址、电话和电子邮件。

在电子邮件列中存储json数据是一种好方法吗?

代码语言:javascript
复制
[ "address2@example2.com", "address2@example2.com", "address2@example2.com" ]

或者为电子邮件创建另一个表,为电话等创建另一个表。

如果存储json数据更好-在rails中使用它的最佳方式是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-27 01:13:03

这是我发现的

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

在文本列

中保存数组、散列和其他不可映射的对象

票数 8
EN

Stack Overflow用户

发布于 2012-04-26 16:17:15

将数据作为JSON字符串存储在单个数据库字段中意味着您将无法使用SQL操作/查询数据-这有点违背了将数据存储在数据库中的意义,您可以将其存储在文本文件中。

我建议在您的组织表和电子邮件地址和电话号码表之间建立one-to-many关系。请参阅video explaining different relationship types

票数 1
EN

Stack Overflow用户

发布于 2012-04-26 17:11:28

建议您将这些信息存储在单个表中。根据你的requirement.it,似乎使用一个好的多态模型会更好。

代码可能如下所示。

代码语言:javascript
复制
module MultiAttr

  def self.included(base)
    base.send :extend, ClassMethods
  end

  module ClassMethods
    def multi_attr(*args)
      args.each do |attr_name|
        class_eval <<-EOF
          has_many attr_#{attr_name}, :class_name => "MultiAttributes", :as => :owner,
             :conditions => {:key => '#{attr_name.singularize}'}

          def add_#{attr_name.singularize}(val)
            self.attr_#{attr_name}.create(:key => #{attr_name.singularize}, :value => val)
            #{attr_name}
          end

          def #{attr_name}
            self.attr_#{attr_name}.map(&:to_attr_model)
          end

        EOF
      end
    end

  end


end

class AttrModel < String

  def initialize(record)
    @record = record
    super(record.value)
  end

  def remove
    @record.destroy
  end

end


#owner_type, owner_id, key, value
class MultiAttribute < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true

  def to_attr_model
    @attr_model ||= AttrModel.new(self)
  end
end

如何使用

代码语言:javascript
复制
class User < ActiveRecord::Base
  include MultiAttr
  multi_attr :emails, :addresses
end

user.emails #=> ["abc@example.com"]
user.add_email "qq@example.com" #=> 
user.emails.first.remove

这些代码未经过测试。但这是我的基本想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10329547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档