ActiveRecord呼び出しからRelation、Array、または他の型を取得するかどうかを教えてください。私はコンソールに.classをタイプすることができ、それを理解することができますが、私が求めていることを私に知らせる何かがコール自体にありますか?ActiveRecordクエリからの戻り値タイプ
3
A
答えて
2
、Railsは時々あなたにある - すべての手品師は:)
Railsの操作を行い、あなたのhas_many
関連をチェーン化することで、複雑なクエリを構築することができます。この機能の核心は、XXXAssocation(例えばHasManyAssociation
のような)クラスの束です。 にhas_many
アソシエーションで電話すると、実際にはHasManyAssociation
インスタンスに対してコールが適用されます。 (あなたが正規表現で見ることができるように、いくつかを除く)
# collection_proxy.rb
instance_methods.each { |m| undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to|proxy_/ }
Railsのundefsを(非表示)HasManyAssociation
インスタンスの方法とし、いくつかの基本的な配列に、あなたの呼び出しを渡すために委任とmethod_missing
を使用しています。しかし、ここで魔法を開始します
delegate :group, :order, :limit, :joins, :where, :preload, :eager_load, :includes, :from,
:lock, :readonly, :having, :pluck, :to => :scoped
delegate :target, :load_target, :loaded?, :to => :@association
delegate :select, :find, :first, :last,
:build, :create, :create!,
:concat, :replace, :delete_all, :destroy_all, :delete, :destroy, :uniq,
:sum, :count, :size, :length, :empty?,
:any?, :many?, :include?,
:to => :@association
def method_missing(method, *args, &block)
match = DynamicFinderMatch.match(method)
if match && match.instantiator?
send(:find_or_instantiator_by_attributes, match, match.attribute_names, *args) do |r|
proxy_association.send :set_owner_attributes, r
proxy_association.send :add_to_target, r
yield(r) if block_given?
end
end
if target.respond_to?(method) || (!proxy_association.klass.respond_to?(method) && Class.respond_to?(method))
if load_target
if target.respond_to?(method)
target.send(method, *args, &block)
else
begin
super
rescue NoMethodError => e
raise e, e.message.sub(/ for #<.*$/, " via proxy for #{target}")
end
end
end
else
scoped.readonly(nil).send(method, *args, &block)
end
end
ので、HasManyAssociation
インスタンスはどのようなそれ自体で処理するために、どのような隠された配列を介して行われる必要があると決定した:(あなたの関連付けをチェーン化している場合)(あなたがレコードをフェッチしようとしている場合)、または会合自体に(class
方法は、HasManyAssociation
に興味がありませんそれでこの隠された配列に呼び出されます。結果は、もちろん、Array
となりますが、少し欺瞞です)。
1
私が知っていることが重要だと思われる行に沿って、私の認識があります。これは主にメモリからで、私の頭の上から少しコンソールの実験をしているので、これが周りを回ると改善できるかどうか確信しています。コメントは歓迎され、要求されました。
Derived ActiveRecord class --> Record Instance
find
Derived ActiveRecord class | Relation --> Relation
where, select, joins, order, group, having, limit, offset, a scope
Derived ActiveRecord class | Relation --> Record Instance
find
Derived ActiveRecord class | Relation --> Result Array
all
Result Array --> Array
to_a
だから何が重要なのはあなたがチェーンのスコープとクエリメソッドできますが、最初のまたは全てまで、
- です。最初またはすべての後に、より多くのスコープとクエリメソッドを呼び出すことはできません。
- allを呼び出すと、結果配列が得られます。いくつかの配列メソッドはデータベース上で動作するように再定義されています。したがって、返された配列で操作したい場合は、to_aを呼び出します。例はcountであり、Result Arrayで呼び出された場合は、配列が再び照会された場合に、配列に含まれるレコード数をデータベースに問い合わせます。あなたが知っている
関連する問題
- 1. メソッドから複数の戻り値タイプ
- 2. dbメソッドからの戻り値タイプ
- 3. Ruby on Rails SQLクエリの戻り値#<ActiveRecord ::リレーション:
- 4. この関数のApt戻り値タイプ
- 5. ヘッダーファイルC++、戻り値の悪いタイプ
- 6. Python SUDS XML以外の戻り値タイプ
- 7. ASP.NET MVCアクションでの戻り値タイプ
- 8. C:戻り値のタイプはデフォルトでINT
- 9. コールバックからの戻り値
- 10. ローカルスコープからの戻り値?
- 11. chrome.tabs.executeScriptからの戻り値
- 12. wxpython:Mainloopからの戻り値
- 13. セッションからの戻り値
- 14. 複合ActiveRecordからMongoIDクエリ
- 15. helperClass.jsからの戻り値がindex.jsに戻らない
- 16. MySQLの関数からの戻り値
- 17. CordovaのgetCurrentPositionからの戻り値
- 18. 複数のアクティビティからの戻り値
- 19. .aspxから.aspx.csへの戻り値
- 20. nodeJSコールバックからの戻り値
- 21. 選択ケースからの戻り値
- 22. 再帰配列からの戻り値 -
- 23. オブジェクトリテラルpaternからの戻り値
- 24. は、だから、()の戻り値
- 25. 親子タスクからの戻り値
- 26. Pythonサブプロセスからの戻り値
- 27. イベントハンドラからのVisual C#戻り値
- 28. モーダルダイアログからの戻り値(IE + Safari)?
- 29. Javaコードからの戻り値
- 30. wixカスタムアクションdllからの戻り値
あなたは結果をどうしようとしているのかを知ることは役に立ちます。 –