3

Ruby on Rails アプリケーションで単一のセルレコードに複数の値を保存するにはどうすればよいですか?

、、およびExpという名前の列を持つテーブルがある場合、ユーザーに教育機関やスキルなどの複数の値を 1 つの行に格納する場合のベスト プラクティスは何ですか?EducationExperienceSkill

ユーザーに複数のテキスト フィールドを使用してもらいたいのですが、同じセル レコードに移動する必要があります。

たとえば、ユーザーが複数のスキルを持っている場合、それらのスキルは 1 つのセルにある必要がありますか? これが最善でしょうか、それともスキル専用の新しいテーブルを作成した方がよいでしょうか?

お知らせ下さい、

ありがとう

4

4 に答える 4

8

複数の値を同じデータベース列に格納することはお勧めしません。クエリが非常に難しくなります。たとえば、特定のスキル セットを持つすべてのユーザーを検索する場合、クエリは読みやすさとパフォーマンスの両方で扱いにくくなります。

ただし、それが理にかなっている場合もあります。

  • データポイントの変数リストを許可したい場合
  • リスト内の値の 1 つに基づいてデータを照会するつもりはありません

ActiveRecord には、これに対するサポートが組み込まれています。HashまたはArrayデータベース列に格納できます。

  1. 列を次のようにマークするだけですText

    rails g model Exp experience:text education:text skill:text
    
  2. 次に、Modelコード内の列をシリアル化します

    class Exp < ActiveRecord::Base
      serialize :experience, :education, :skill
      # other model code
    end
    
  3. Hashこれで、 orArrayをデータベース フィールドに保存できます。

    Exp.new(:skill => ['Cooking', 'Singing', 'Dancing'])
    
于 2013-09-09T04:30:30.443 に答える
1

シリアル化されたリストを単一の列(カンマ区切り)で使用して実行できますが、非常に悪い考えです。理由については、次の回答を読んでください。

ユーザーとスキルの間に一対多の関係を持つようにスキーマを変更することをお勧めします。

于 2013-09-09T04:19:10.193 に答える
0

どのような機能が必要かによって異なります。Exp モデルの属性をフォーム (新規および更新操作用) にバインドし、それらにいくつかの検証を行いたい場合は、常に別のテーブルに保持することをお勧めします。一方、これらがデータベースで必要な単なる属性である場合は、それらを単一の列に保持します。配列やハッシュなどのシリアル化されたオブジェクトをデータベース列に保持する方法があります。必要に応じてそれらを配列/ハッシュにして、このように保存します。

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize

シリアライズされた属性は、テーブルから引き出されると自動的にデシリアライズされ、保存されると自動的にシリアライズされます。

于 2013-09-09T04:40:23.417 に答える
0

Rails 4 と PostgreSQL には、すぐに使用できるhstoreサポートが付属しています。詳細はこちらRails 3 では、 gemを使用して有効にすることができます。

于 2013-09-09T04:01:25.650 に答える