2012-01-31 73 views
0

非常有經驗,但自學PHP/MySQL和玩Rails。真的很喜歡我用它做的事情,但是我認真對待我腦海中的事情應該很簡單;將來自各個表格的數據連接在一起,然後以各種視圖顯示。我想我明白了Active Record的概念,但我似乎無法按照自己想要的方式使其工作。Rails新手 - 我錯過了真正明顯的東西嗎?

我正在構建一個相當複雜的音樂編目系統翼Discogs,與藝術家,發行,產品跟蹤和標籤水平,並有以下型號:

class Artist < ActiveRecord::Base 
    has_and_belongs_to_many :releases 
end 

class Release < ActiveRecord::Base 
has_many :products 
end 

class Product < ActiveRecord::Base 
belongs_to :release 
has_many :tracks 
end 

class Tracks < ActiveRecord::Base 
has_and_belongs_to_many :products 
end 

最後,我要介紹的領土,銷售和其他數據,但直到我指出上面的基礎知識,我不能移動fwd。

在我的產品控制器我有:

@product = Product.find(:all, :include => :release) 

主要生產:

Processing by ProductsController#index as HTML 
Product Load (0.1ms) SELECT "products".* FROM "products" 
Release Load (0.2ms) SELECT "releases".* FROM "releases" WHERE "releases"."id" IN (1, 2, 3, 10, 4) 

但我想,如果我的聯想是正確的,這可能是不必要的?

在我的產品視圖中,例如,我想列出從發佈表中拉入標題的產品。我已經嘗試了以下內容,但在標題上出現'NoMethodError':

<% @product.each do |product| %> 

<tr>  
<td><%= product.title %></td> 
<td><%= product.cat_no %></td> 
<td><%= product.barcode %></td> 
<td></td> 

</tr> 
<% end %> 

幫助!!

提前非常感謝。

瑞安

+0

我可以看到你對此感到困惑。我認爲你在這裏錯過了很多東西(例如,你應該在你的發佈模型中有一個'has_and_belongs_to_many:artists'),所以我建議你不要糾正你,而是要去看看http://blog.hasmanythrough.com/。 2006/4/20 /多到許多舞蹈斷。它擁有你需要的一切來推動這個 – Ashitaka 2012-01-31 11:55:58

+0

哈哈,我會說失望!它應該是簡單的權利?我想我在走路前試圖跑步。 感謝您的評論,我現在就去看看你的博客。 – Raoot 2012-01-31 12:47:11

+0

哦,博客不是我的。我偶然發現了它,同時學習了rails並研究瞭如何實現連接模型和表格,並且該站點從此一直對我非常寶貴。它非常好,它解釋了使用'HABTM'關係和'has_many:through'關係(我認爲是你想要的)之間的主要區別。 – Ashitaka 2012-01-31 12:56:39

回答

0
Release Load (0.2ms) SELECT "releases".* FROM "releases" WHERE "releases"."id" IN (1, 2, 3, 10, 4) 

,因爲你用的是產生上述查詢:包括=>:協會(:你的情況發佈)中找到method.This的Rails的屬性被稱爲預先加載廣泛使用進行性能優化。我認爲您的關聯中沒有問題。

如果你已經使用

@products = Product.all

並且在視圖頁面

<% @product.each do |product| %> 
<tr>  
    <td><%= product.title %></td> 
    <td><%= product.cat_no %></td> 
    <td><%= product.barcode %></td> 
    <td><%= product.release.name %></td> 
</tr> 
<% end %> 

方法調用product.release將創建 'N' 上面的查詢(n個數據庫命中)

如果使用:include選項,則可以避免.Rails會預加載相關聯的關係(:release)。(只有1 DATABSE命中)

欲瞭解更多詳情,請訪問

http://guides.rubyonrails.org/active_record_querying.html

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+0

謝謝。我已將控制器更改爲使用 @products =產品(:全部) 但是,我現在爲我的產品控制器獲得了未定義的方法'Product':( – Raoot 2012-01-31 12:45:05

+0

更改爲@products = Product.all並清除了該錯誤: - ) – Raoot 2012-01-31 12:49:57

+0

我也更新了答案。感謝您的通知。 – 2012-01-31 12:57:39

0

的問題是:

我試過下面卻得到了一個 'NoMethodError'標題:

根據他的代碼

<td><%= product.title %></td> 

我想知道,如果你錯過了你的「產品」表中的「標題」一欄,我建議你應該檢查你的表的結構,以確保該列存在。

+0

標題欄位於發佈表......我基本上想要設置主發佈版,然後每個產品都是發佈版的變體......所以主發佈版會是「黑暗」例如,我將添加變體或產品,每個變體或產品都按格式/目錄編號/發佈日期等進行標識。 – Raoot 2012-01-31 12:40:07

+0

請參閱我的更新答案。 – 2012-02-01 08:09:15

0

也許在您的控制檯中嘗試"rake db:migrate"以更新您的數據庫。如果您已經生成了產品模型,但沒有記住遷移數據庫,則該表不會在數據庫中。您可能也忘記將product.title添加爲數據庫的遷移/部分內容。