如果我要從ActiveRecord調用中獲取關係,數組或其他類型,什麼可以讓我知道?我知道我可以在控制檯中鍵入.class並找出它,但通話本身是否有某些東西能讓我知道我在問什麼?從ActiveRecord查詢返回類型
3
A
回答
2
你知道,有時Rails的謊言給你 - 所有的魔術師做:)
Rails允許您通過鏈接你的has_many
協會構建複雜的查詢。此功能的核心是一堆XXXAssocation(如HasManyAssociation
)類。 當您在has_many
關聯上致電.class
時,您的呼叫實際上適用於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
所以,最重要的是,
- 你可以連續使用範圍和查詢方法,但直到第一個或全部。首先或所有你不能調用更多的作用域和查詢方法。
- 當你全部呼叫時,你會得到一個結果數組。一些Array方法已被重新定義爲對數據庫起作用,因此如果您想對返回的數組進行操作,請調用to_a。 Count就是一個例子,如果在結果數組上調用它,它將查詢數據庫中有多少記錄將在數組中再次查詢。
相關問題
- 1. 返回類型的DataTable從LINQ查詢
- 2. 從LINQ查詢返回匿名類型?
- 3. Mongodb查詢返回類型
- 4. 查詢ID返回類型
- 5. 返回自定義查詢select activerecord
- 6. 的ActiveRecord ::#查詢第一返回集合
- 7. AngularJS +服務棧查詢返回類型
- 8. 返回linq查詢的數據類型
- 9. 返回參數的類型名查詢
- 10. Telerik OpenAccess ORM - 查詢的返回類型
- 11. Solr:查詢並返回x個類型
- 12. JPQL查詢的返回類型
- 13. 從密碼查詢返回泛型類型
- 14. 返回泛型類型從SQL查詢方法
- 15. ActiveRecord查詢返回一個不正確的模型
- 16. 從方法返回部分linq查詢 - 如何聲明返回類型
- 17. 從單個ibatis查詢返回多個類型
- 18. 如何從Powershell查詢excel時強制數據類型返回?
- 19. 如何從我的查詢中返回SQL數據類型?
- 20. 如何從MySQL查詢返回字段類型?
- 21. 返回從mysqli stmt查詢
- 22. 返回從HQL查詢
- 23. 從查詢返回空行
- 24. 爲什麼ARel查詢返回爲ActiveRecord :: Relation類而不是父類?
- 25. 超類型的hibernate查詢返回子類型的結果,如何僅返回超類型的結果?
- 26. 通用返回從類型
- 27. 從已返回類型
- 28. Linq2EF在查詢投影中返回子類的類型
- 29. ActiveRecord返回ActiveRecord ::關係
- 30. 查詢返回
這將有助於瞭解您想要對結果做什麼。 –