Как получить дополнительные атрибуты от многих через - PullRequest
1 голос
/ 14 июля 2010

Я использую 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

Я пытаюсь распечатать все предметы, связанные с игроком, и для каждого предмета вывести значения «Имя», «Стоимость», «Описание», «Итого» и «Торгуемые».

Когда я вызываю @player_items в items.html.erb, я могу получить доступ только к атрибутам, связанным с моделью элемента, а не к любым атрибутам, связанным с моделью PlayersItem.

Я пытаюсь получить доступ к атрибутам из модели items и модели Players_items в одном и том же «вызове», похожем на оператор соединения SQL, подобный этому

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

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 22 октября 2010

Используется в контроллере

@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 голосов
/ 14 июля 2010
@player = Player.order("created_at").last
@player.players_items.each do |item|
  puts "#{item.player}: #{item.description} cost:#{item.cost}"
end

Имеет много, через это немного странно.Думайте об этом как о модели, имя которой (в идеале) должно описывать отношения между двумя другими моделями.Так что, может быть, если оборудование раздается игрокам, вы можете позвонить в рассылку модели объединения или получить кредит или что-то еще.Players_items - это соглашение об именах для таблиц соединения, которые не будут адресованы напрямую.Я надеюсь, что это помогает!

...