【问题标题】:How To Get Additional Attributes From Has Many Through如何从 has many through 获取附加属性
【发布时间】:2010-07-13 22:14:03
【问题描述】:

我正在使用 Rails 3 beta 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 时,我只能访问与项目模型关联的属性,而不能访问与 PlayersItem 模型关联的任何属性。

我试图在同一个“调用”中访问 items 模型和 player_items 模型中的属性,类似于 SQL Join Statement 这样的

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

这可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 has-many-through


    【解决方案1】:
    @player = Player.order("created_at").last
    @player.players_items.each do |item|
      puts "#{item.player}: #{item.description} cost:#{item.cost}"
    end
    

    有很多通过有点奇怪。将其视为一个模型,其名称应该(理想情况下)描述其他两个模型之间的关系。因此,如果设备正在分发给玩家,您可以调用加入模型分发或贷款或其他方式。 player_items 是连接表的命名约定,不会直接处理。 希望对您有所帮助!

    【讨论】:

    • 但是我不需要访问players_items 连接表,因为我有分配给连接关系的属性(“total”和“traded”)?我正在尝试在同一个“调用”中访问 items 模型和 player_items 模型中的属性,类似于 SQL Join Statement 这样SELECT * FROM players_items INNER JOIN items ON players_items.item_id=items.id WHERE players_items.player_id = "@player"
    • 连接表用于 HABTM 关系。只有两个 fk,没有其他列。你所拥有的是一个加入模型。我的理解是,当您开始收集有关模型之间关系的信息时,该关系就变成了需要模型的“事物”。您将需要使用该模型来访问您需要的信息。在每个块中,您都可以访问您要求的所有信息。当您习惯使用 DB 时,这不是您所期望的。编写 Player.find_by_sql 将得到您所期望的(即具有来自 player_items 表的属性的玩家模型)。
    • 空间不足。仅供参考,但不推荐使用 find_by_sql 。我在 MySQL 中开发并部署到 postgres 服务器。 Find_by_sql 会让这种事情变得非常痛苦。小心使用。
    • 好的。也许我没有正确设置我的模型,因为在我的 PlayersItems 连接表中,我同时具有适用于该关系的 fk 和其他属性(“total”和“traded”)。这不是为关系添加属性的正确方法吗?我的模型遵循guides.rails.info/association_basics.html 第 2.4 节。我不打算使用 find_by_sql,它是用来表示我想要完成的事情。
    • 对不起!我想我把你弄糊涂了。给我给你的代码试试。基本上所有正在发生的事情是您正在通过连接模型而不是通过播放器模型访问您想要的信息。我给你的代码展示了当你有一个玩家模型可以使用时如何做到这一点。
    【解决方案2】:

    在控制器中使用

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多