9

たとえば、組織テーブルがあります

ID, name, address, phone, email, etc...

次に、複数の住所、電話、メールを追加したいと考えています。

このようにjsonデータをメール列に保存するのは良い方法ですか

[ "address2@example2.com", "address2@example2.com", "address2@example2.com" ]

または、メール専用と電話用に別のテーブルを作成するなど...

jsonデータを保存する方が良い場合-レールでそれを使用する最良の方法は何ですか?

4

3 に答える 3

8

これが私が見つけたものです

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

配列、ハッシュ、およびその他のマップ不可能なオブジェクトをテキスト列に保存する

于 2012-04-26T17:13:03.423 に答える
1

単一のデータベース フィールドに JSON 文字列としてデータを格納すると、SQL を使用してデータを操作/クエリできないことを意味します。これは、データをデータベースに格納する点を無効にします。テキストに格納することもできます。ファイル。

組織テーブルと電子メール アドレスと電話番号のテーブルの間には、 1対多の関係をお勧めします。さまざまな関係の種類を説明するビデオを見る

于 2012-04-26T08:17:15.160 に答える
0

これらの情報を1つのテーブルに保存することをお勧めします。要件に応じて、優れたポリモーフィックモデルを使用する方が良いようです。

コードはこれを好むかもしれません。

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

使い方

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

これらのコードはテストされていません。しかし、それは私の基本的な考え方です。

于 2012-04-26T09:11:27.990 に答える