2012-02-27 29 views
12

看完後:thisactiverecord - 如何獲得連接表的所有列

我還是不明白。在控制檯中:

puts Category.joins(:posts) 

它在類別和帖子上執行連接或左連接。

但是,返回的所有數據只是分類表中的列。如何在Post中獲取這些列數據。 ?

我應該讓另一個模型來實現這個嗎?

看完後:this find_by_SQL是唯一的方法嗎?如果可能的話,我想要ActiveRecord方式。

謝謝。

+0

您應該更具體地瞭解您嘗試實現的目標。如果你想要它「活動記錄方式」,你甚至不應該談論「列」,因爲你操縱對象而不是表格。如果你真的需要原始數據,你可以使用'ActiveRecord :: Base.connection.select_all('SELECT ...')',這將返回一個散列數組(無模型實例)。 [文檔在這裏](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-select_all) – 2012-02-27 11:18:20

+0

謝謝,我現在使用這種方式:ActiveRecord :: Base.connection .select_all(Category.joins(:posts).to_sql)),這樣太討厭了嗎? – 2012-02-27 11:20:49

+0

沒問題。但是,如果您確實想要使用ORM方式,則應該只對這些真正複雜的SQL查詢使用這些技巧。對於這樣一個微不足道的問題,我會使用@ abhishek的解決方案+'includes'來代替。如果你不用OO方式編碼,爲什麼還要使用ORM呢? – 2012-02-27 11:35:44

回答

4

你可以做進一步的查詢,像得到的職位表中的列 -

Category.joins(:posts).collect{|category| category.posts.map{|post| post.attributes.merge(category.attributes) } } 

這會給你崗位的一個巨大的列表和類別屬性合併在一起爲每個類別。

但是,在類別上進行連接的要點是獲得一組具有某些特定連接條件的類別。如果我們把下面的例子同樣的指南中,

Post.joins(:category, :comments) 

這也只給你的職位名單,但名單隻包含下面的加盟約束,這是崗位,他們都有一個類別,一條評論。

+3

請注意,'collect'可能會導致N + 1查詢問題。爲了避免這種情況,使用'includes'。請參閱[關於急切加載的RoR指南](http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations) – 2012-02-27 11:21:04

+0

@m_x當然,該代碼僅供演示。 – abhishek 2012-02-27 11:37:43

+0

謝謝@m_x和abhishek – 2012-02-27 11:44:17

6

您可以嘗試select()方法:

Category.select("categories.*, posts.*").joins(:posts) 
+1

感謝您的回覆。這是行不通的。它仍然只返回「類別。*」。雖然生成的SQL是「SELECT categories。*,posts。* from ... – 2012-02-27 10:28:30

+0

如何檢查它是否正常工作?我剛測試過它,對我來說工作正常 – Ineu 2012-02-27 10:53:02

+0

我在」rails console「中運行此命令, 。使用puts和ap(真棒打印): puts Category.select(「categories。*,posts。*」)。joins(:posts) 它只返回#對象。 – 2012-02-27 10:59:23

相關問題