単一のレコードでの作業中に「includes」呼び出しが行われたかどうかを知る方法は?

jgomo3

動機

その動機は、リレーションチェーンに含まれているモデルのシリアル化を埋め込みたいということでした。私が行ったことはリレーションレベルで機能しますが、1つのレコードを取得すると、シリアル化は私が行ったことを利用できません。

私がこれまでに達成したこと

基本的に私がしているのはincludes_values、クラスのメソッド使用することですActiveRecord::Relation。これは、これまでに含まれているものを単純に教えてくれます。つまり、

> Appointment.includes(:patient).includes(:slot).includes_values
=> [:patient, :slot]

これを利用するために、この初期化子を使用as_jsonして、ActiveRecord::Relationレベルでメソッドを上書きしています。

# config/initializers/active_record_patches.rb
module ActiveRecord
  class Relation
    def as_json(**options)
      super(options.merge(include: includes_values)) # I could precondition this behaviour with a config
    end
  end
end

何それがないと、私のためのオプションを追加することであるincludeas_json関係する方法。

だから、古いチェーン:

Appointment.includes(:patient).includes(:slot).as_json(include: [:patient, :slot])

最後のインクルードなしで今書くことができます:

Appointment.includes(:patient).includes(:slot).as_json

同じ結果が得られます(PatientおよびSlotモデルは生成されたハッシュに埋め込まれます)。

問題

問題は、メソッドincludes_valuesがクラスのActiveRecord::Relationものであるため、呼び出しincludesが行われたかどうかを知るためにレコードレベルでそれを使用できないことです。

そのため、現在、このようなクエリからレコードを取得して呼び出すとas_json、埋め込みモデルを取得できません。

そして実際の問題は答えることです:

それが起こったとすると、現在のレコードを取得したクエリチェーンに含まれているモデルを知る方法は?

この質問に答えることができればas_json、自分のモデルのメソッドを次のように上書きできます

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  extend Associations

  def as_json(**options)
    super(options.merge(include: included_models_in_the_query_that_retrieved_me_as_a_record))
  end
end

1つのアイデア

私が持っているアイデアの1つは、includesどこかを上書きすることです(初期化子で、ActiveRecord::Relationクラスまたはクラスを直接上書きする可能性がありますApplicationRecord)。しかし、一度そこに着くと、リレーションによって生成されたレコードに任意の情報を「スタンプ」する簡単な方法が見つかりません。

3limin4t0r

この解決策はかなり不器用に感じられ、そこにはもっと良い選択肢があるかもしれません。

class ApplicationRecord < ActiveRecord::Base
  def as_json(**options)
    loaded_associations = _reflections.each_value
      .select { |reflection| association(reflection.name).loaded? }
      .map(&:name)

    super(options.merge(include: loaded_associations))
  end
end

これは第1レベルの関連付けのみをロードすることに注意してください。その場合がネストされているためAppointment.includes(patient: :person)、のみ:patientが返さ:personれます。物事を再帰的にすることを計画している場合は、循環ロードされた関連付けに注意してください。

指摘する価値があるのは、現在include: ...、提供されているオプションをマージていることです他のインクルードオプションを使用する選択肢をユーザーに与えません。reverse_merge代わりに使用することをお勧めします。または、配置を入れ替え{includes: ...}.merge(options)ます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

どのスレッドが自分のLogメソッドを呼び出したかを知るにはどうすればよいですか?

分類Dev

python Tkinter:別のスレッドで実行されている別の関数を呼び出す前に「作業中」のステータスバーをロードするにはどうすればよいですか?

分類Dev

rxJava netwrok呼び出しを行い、応答に基づいてUIスレッドで作業を進めるための最良の方法は何ですか

分類Dev

Pythonスクリプトがコマンドラインのインタープリターで呼び出されたのか、実行可能ファイルとして(shebang経由で)呼び出されたのかを知るにはどうすればよいですか?

分類Dev

呼び出し元は、同じ名前のどのメンバー関数が呼び出されるかをどのように知るのですか?

分類Dev

このコードを実行するたびにトレースバック(最後の最後の呼び出し)が表示されますが、これを修正するにはどうすればよいですか?

分類Dev

呼び出されたメソッドが最後のものであるかどうかを知る方法

分類Dev

どのボタンがSwift4で別のビューを呼び出したかを知るにはどうすればよいですか?

分類Dev

関数がコンソールから呼び出されたのか、ソースコードから呼び出されたのかをどのように知ることができますか

分類Dev

iOSプログラミングでデリゲートを呼び出すにはどうすればよいですか?コードを呼び出さない場合、アプリはコードをいつ実行する必要があるかをどのように知るのですか?

分類Dev

呼び出された(ネストされた/内側の)バッチファイル用に、呼び出し側(外側)のバッチファイルの作業ディレクトリを保持するにはどうすればよいですか?

分類Dev

ncursesのinitscr()が以前に呼び出されたかどうかを知る方法は?

分類Dev

`methods`が失敗したときに、関数呼び出しでどのメソッドが使用されているかを知る方法は?

分類Dev

javascriptを使用したMSSQLAPI呼び出しから、特定の値を持つレコードが配列に存在するかどうかを判断する方法

分類Dev

特定の関数からのすべてのAJAX呼び出しがいつ終了したかを知るにはどうすればよいですか?

分類Dev

非同期メソッド呼び出しが呼び出し元のコンテキストを変更するかどうかを知るにはどうすればよいですか?

分類Dev

JREは、例外が発生したコードの行番号をどのように知るのですか?

分類Dev

この作業単位を使用しているときに、Disposeが2回呼び出されるのはなぜですか?

分類Dev

any_instanceなしでメソッド呼び出しが行われなかったことを表明するにはどうすればよいですか?

分類Dev

ユーザーがどのようにbashからプログラムを呼び出したかを知る方法はありますか?

分類Dev

複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

分類Dev

複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

分類Dev

Openerp-特定のビューが呼び出されるたびに実行する関数を呼び出すにはどうすればよいですか?

分類Dev

コントローラーでアクションをレンダリングする作業はどのように行われますか?

分類Dev

私のサービスが放送受信機とAndroidからいつ呼び出されたかを知るにはどうすればよいですか?

分類Dev

関数が再度呼び出された場合、関数の最初の呼び出しの実行を停止するにはどうすればよいですか?

分類Dev

TImage.Picture.LoadFromFileを呼び出した後、コードが続行されるのはなぜですか?

分類Dev

Pythonスーパークラスからメソッドを実行する場合、それを呼び出した子クラスの名前をどのように知ることができますか?

分類Dev

`registerUserNotificationSettings`への呼び出しがSwiftで行われたことがあるかどうかの判断

Related 関連記事

  1. 1

    どのスレッドが自分のLogメソッドを呼び出したかを知るにはどうすればよいですか?

  2. 2

    python Tkinter:別のスレッドで実行されている別の関数を呼び出す前に「作業中」のステータスバーをロードするにはどうすればよいですか?

  3. 3

    rxJava netwrok呼び出しを行い、応答に基づいてUIスレッドで作業を進めるための最良の方法は何ですか

  4. 4

    Pythonスクリプトがコマンドラインのインタープリターで呼び出されたのか、実行可能ファイルとして(shebang経由で)呼び出されたのかを知るにはどうすればよいですか?

  5. 5

    呼び出し元は、同じ名前のどのメンバー関数が呼び出されるかをどのように知るのですか?

  6. 6

    このコードを実行するたびにトレースバック(最後の最後の呼び出し)が表示されますが、これを修正するにはどうすればよいですか?

  7. 7

    呼び出されたメソッドが最後のものであるかどうかを知る方法

  8. 8

    どのボタンがSwift4で別のビューを呼び出したかを知るにはどうすればよいですか?

  9. 9

    関数がコンソールから呼び出されたのか、ソースコードから呼び出されたのかをどのように知ることができますか

  10. 10

    iOSプログラミングでデリゲートを呼び出すにはどうすればよいですか?コードを呼び出さない場合、アプリはコードをいつ実行する必要があるかをどのように知るのですか?

  11. 11

    呼び出された(ネストされた/内側の)バッチファイル用に、呼び出し側(外側)のバッチファイルの作業ディレクトリを保持するにはどうすればよいですか?

  12. 12

    ncursesのinitscr()が以前に呼び出されたかどうかを知る方法は?

  13. 13

    `methods`が失敗したときに、関数呼び出しでどのメソッドが使用されているかを知る方法は?

  14. 14

    javascriptを使用したMSSQLAPI呼び出しから、特定の値を持つレコードが配列に存在するかどうかを判断する方法

  15. 15

    特定の関数からのすべてのAJAX呼び出しがいつ終了したかを知るにはどうすればよいですか?

  16. 16

    非同期メソッド呼び出しが呼び出し元のコンテキストを変更するかどうかを知るにはどうすればよいですか?

  17. 17

    JREは、例外が発生したコードの行番号をどのように知るのですか?

  18. 18

    この作業単位を使用しているときに、Disposeが2回呼び出されるのはなぜですか?

  19. 19

    any_instanceなしでメソッド呼び出しが行われなかったことを表明するにはどうすればよいですか?

  20. 20

    ユーザーがどのようにbashからプログラムを呼び出したかを知る方法はありますか?

  21. 21

    複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

  22. 22

    複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

  23. 23

    Openerp-特定のビューが呼び出されるたびに実行する関数を呼び出すにはどうすればよいですか?

  24. 24

    コントローラーでアクションをレンダリングする作業はどのように行われますか?

  25. 25

    私のサービスが放送受信機とAndroidからいつ呼び出されたかを知るにはどうすればよいですか?

  26. 26

    関数が再度呼び出された場合、関数の最初の呼び出しの実行を停止するにはどうすればよいですか?

  27. 27

    TImage.Picture.LoadFromFileを呼び出した後、コードが続行されるのはなぜですか?

  28. 28

    Pythonスーパークラスからメソッドを実行する場合、それを呼び出した子クラスの名前をどのように知ることができますか?

  29. 29

    `registerUserNotificationSettings`への呼び出しがSwiftで行われたことがあるかどうかの判断

ホットタグ

アーカイブ