2010-07-13 57 views
1

我用Rails 3測試版從擁有4如何獲得其他許多屬性通過

我有以下型號:

class Player < ActiveRecord::Base 
has_many :players_items, :dependent => :destroy 
has_many :items, :through => :players_items 
end 

class PlayersItem < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :item 
end 

class Item < ActiveRecord::Base 
    has_many :players_items, :dependent => :destroy 
    has_many :players, :through => :players_items 
end 

在players_controller

def items 
    @player = Player.find(params[:id]) 
    @player_items = @player.items 
    end 

我有以下屬性

--Items Model-- 
Item_id:Integer 
Name:String 
Cost:Integer 
Description:Text 

--PlayersItem Model-- 
Item_id:Integer 
Player_id:Integer 
Total:Integer 
Traded:Integer 

我試圖打印出與玩家相關的所有項目,併爲每個項目打印出「名稱」,「成本」,「描述」,「總計」和「交易」值。

當我在items.html.erb中調用@player_items時,我只能訪問與Item Model關聯的屬性,而不能訪問與PlayersItem模型關聯的任何屬性。

我試圖訪問同一無論從項目模型和players_items模型屬性「呼」類似於SQL加入這樣

SELECT * FROM players_items INNER JOIN items ON players_items.item_id=items.id 
WHERE players_items.player_id = "@player" 

說法是這可能嗎?

回答

0

用於控制器

@player = Player.find(params[:id], :include => [:items,:players_items]) 

並在視圖

@player.players_items.each do |player| 
puts "#{player.name}: #{player.player.item.description} cost:#{player.item.cost}" 
end 
0
@player = Player.order("created_at").last 
@player.players_items.each do |item| 
    puts "#{item.player}: #{item.description} cost:#{item.cost}" 
end 

有很多通過是有點奇怪。把它看作是一個模型,它的名字應該(理想地)描述兩個其他模型之間的關係。所以,如果設備正在分發給玩家,你可以稱之爲加入模式分配或貸款等等。 players_items是連接表的命名約定,不會直接解決。 我希望有幫助!

+0

但不會我需要訪問players_items連接表,因爲我有一個分配給聯接關係(「總」屬性和「交易」)? 我試圖從同樣的「調用」中訪問類似於SQL Join Statement這樣的項目模型和players_items模型的屬性 'SELECT * FROM players_items INNER JOIN items ON players_items.item_id = items.id WHERE players_items .player_id =「@player」' – Joey 2010-07-14 01:23:50

+0

連接表用於HABTM關係。只有兩個fk,沒有其他列。你有什麼是一個加入模型。我的理解是,當你開始收集關於模型之間關係的信息時,這種關係變成了需要模型的「事物」。您將需要使用該模型來訪問您需要的信息。在每個塊的內部,您可以訪問所有需要的信息。當你習慣了數據庫時,它不是你期望的。寫一個Player.find_by_sql 會給你你所期待的(即player_items表的屬性來自一個玩家模型)。 – mikewilliamson 2010-07-14 03:21:24

+0

空間不足。僅供參考,find_by_sql不推薦。我在MySQL中開發並部署到postgres服務器。 Find_by_sql會使這種事情變得非常痛苦。小心使用。 – mikewilliamson 2010-07-14 03:29:39

相關問題