1

私のアプリケーション モデルでは、患者が CustomFields を持つことができます。すべての患者の税関フィールドは同じです。通関フィールドは、患者ドキュメントに埋め込まれます。カスタム フィールドを追加、更新、および削除できる必要があり、そのようなアクションはすべての患者に適用されます。

class Patient
  include Mongoid::Document
  embeds_many :custom_fields, as: :customizable_field

  def self.add_custom_field_to_all_patients(custom_field)
    Patient.all.add_to_set(:custom_fields, custom_field.as_document)
  end

  def self.update_custom_field_on_all_patients(custom_field)       
    Patient.all.each { |patient| patient.update_custom_field(custom_field) }
  end

  def update_custom_field(custom_field)
    self.custom_fields.find(custom_field).update_attributes({ name: custom_field.name, show_on_table: custom_field.show_on_table } )
  end

  def self.destroy_custom_field_on_all_patients(custom_field)
    Patient.all.each { |patient| patient.remove_custom_field(custom_field) }
  end    

  def remove_custom_field(custom_field)
    self.custom_fields.find(custom_field).destroy
  end
end

class CustomField
  include Mongoid::Document

  field :name,          type: String
  field :model,         type: Symbol
  field :value,         type: String
  field :show_on_table, type: Boolean, default: false

  embedded_in :customizable_field, polymorphic: true
end

すべての患者には、同じ通関フィールドが埋め込まれています。カスタム フィールドの追加は非常にうまく機能します。私の疑問は、更新と破棄についてです。

これは機能しますが、遅いです。各ペイエントに対してクエリを作成します。理想的には、MongoDB に「IDでドキュメントを更新します。これは、 Patientコレクション内のすべてのドキュメントの配列 *custom_fields* に埋め込まれています」と言えます。破壊するための同名。

Mongoidでこれを行うにはどうすればよいですか?

Mongoid 3.1.0 と Rails 3.2.12 を使用しています

4

1 に答える 1

0

埋め込まれたドキュメントを使って効率よくそれを行う方法はないと思います。

コレクションでメソッドdelete_allとメソッドを使用できるように、モデル間に参照関係を設定することを検討する必要があります。update_all

于 2013-02-18T12:58:15.100 に答える