2010-10-08 57 views
2

我工作的Rails項目時遇到用下面加入了一些問題:Rails的連接表問題

@page = Page.find(params[:id], :joins => "LEFT JOIN page_translations ON page_translations.page_id = pages.id") 

出於某種原因,它只能拉回從頁表的一切。

這裏是我的第

class Page < ActiveRecord::Base 
    has_many :users_pages 
    has_many :users, :through => :users_pages 
    has_many :page_translations 
    has_many :categories 
    accepts_nested_attributes_for :page_translations 
    accepts_nested_attributes_for :categories 
end 

模型這裏是我的PageTranslation

class PageTranslation < ActiveRecord::Base 
    belongs_to :pages 
end 

預先感謝所有幫助典範!

編輯(@thenduks)

日誌運行兩個單獨的查詢:

Page Load (0.5ms) SELECT `pages`.* FROM `pages` WHERE (`pages`.`id` = 1) LIMIT 1 

PageTranslation Load (0.5ms) SELECT `page_translations`.* FROM `page_translations` WHERE (`page_translations`.page_id = 1) 

這裏是我的控制器是什麼樣子:

@page = Page.find(params[:id], :include => :page_translations) 
+0

你在期待什麼?當你做page.page_translations時你會得到什麼? – 2010-10-09 00:01:20

+0

夥計。我只是想通了!我會在下面更新我的答案... – John 2010-11-01 04:01:54

+0

下面是一個很好的答案相同的問題:http://stackoverflow.com/questions/27523326/when-joining-table-rails-anyway-makes-additional-request-when-accessing - 字段 – 2014-12-17 11:07:54

回答

0

如何:

Page.find(params[:id], :include => :page_translations) 

編輯

好的,所以最近一段時間,ActiveRecord在連接/包含方面的行爲似乎已經發生了變化。指南仍然指的是能夠通過兩個協會來完成這項工作,如has_many :orders, :include => :line_items和類似的...但是包括has_many的記錄...在諮詢了co-worker之後,我們遇到了some info on the subject。似乎單一的整體查詢變得過於複雜和醜陋,並且導致了ActiveRecord爲您提供的一些更好的細節和重複的行,這種情況出現問題。

TL; DR:它不能像那樣工作。預計有2個查詢。

+0

它仍然拉回所有從頁表 – dennismonsewicz 2010-10-08 21:01:30

+1

啊,這可能是因爲你已經錯誤地命名了'PageTranslation'中的'belongs_to'。您可能需要'belongs_to:page'。 – rfunduk 2010-10-09 22:59:42

+0

@thenduks,我的模型包含belongs_to:頁面,並且我仍然沒有得到查詢中返回的所有內容的預期結果。這讓我難以置信!我的意思很簡單,我可以做兩個數據庫調用,但那不是有效的。 – dennismonsewicz 2010-10-11 03:42:06

2

我被困在這件事情上,浪費了幾個小時試圖弄清楚。事實證明,使用查詢接口的joins方法不會初始化與要連接的表相關的模型。您可以通過查看服務器控制檯中的SQL語句或者甚至將ActiveRecord日誌記錄重定向到Rails控制檯中的STDOUT來查看。

我是非常感謝對此感到失望。這似乎不像是如何工作的 - 這當然不是我所期待的。因爲它在邊緣指南的熱切加載部分,所以我期待着它的急切加載。

反正我不能再浪費更多的時間試圖弄明白,所以我做了什麼,而不是爲使用花哨查詢界面,簡單地建立我的查詢,使用to_sql獲得SQL我的查詢,然後將SQL傳遞給select_all,後者返回一個散列數組,其中數組中的每個元素(每個散列)表示一行。

例子:

query = Post.joins("LEFT JOIN categories ON post.category_id = categories.id") 
query.select("posts.*, category.category_name") 
con = ActiveRecord::Base.connection 
results = con.select_all(query.to_sql) 

結果:

[{"id": 1, "title": "joins, why have you forsaken me", "category_name": "frustration"},{"id": 2, "title": "pizza", "category_name": "food"}] 

說實話,我還是想知道肯定,如果有可能做到這一點,我們的思維方式它應該工作,或者它的方式應該工作。否則,我認爲除了幫助我們構建查詢外,沒有理由使用joins方法。因此,如果任何Rails的專家知道如何使用joins來填充與這些表相關的模型,請讓我(我們)知道!

無論如何,我希望這可以幫助你現在繼續前進。


UPDATE:所以我覺得我想通了。我偶然發現了這個blog post。事實證明,當使用查詢接口的joins方法時,Rails實際上會將您從連接表中選擇的列添加爲要連接的模型的屬性方法

使用上面的同一個例子,我實際上可以通過簡單地調用post.category_name訪問每個帖子的category_name#$%!令人難以置信的簡單,但沒有任何文檔!

這一次是:

query = Post.joins("LEFT JOIN categories ON post.category_id = categories.id") 
query.select("posts.*, category.category_name") 
posts = query.all 

# access a post's category name 
puts posts[0].category_name 

# this is what I thought I would be able to do 
# without Rails making another query to the database 
puts posts[0].category.category_name 

我希望這有助於! :)

+0

感謝上page_translations您回覆芽!這很有道理! – dennismonsewicz 2010-10-11 03:40:04

+0

沒有問題。很高興我能幫上忙。 =) – John 2010-10-12 18:05:51

+0

在我的原始帖子結尾添加了更新。一探究竟。 – John 2010-11-01 04:18:03