2010-07-13 55 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