2013-06-11 7 views
0

новинка для рельсов и пытается выработать самый «рельсный» способ реализовать следующее.has_many через отношения с промежуточной моделью

Ниже:

class Team 
    has_many :team_memberships 
    has_many :players, through: :team_memberships 
end 

class TeamMembership 
    acts_as_list scope: :team_id 
    belongs_to :team 
    belongs_to :player 
end 

class Player 
    has_many :team_memberships 
    has_many :teams, through: team_memberships 
end 

В моей TeamMembership модели у меня есть дополнительные столбцы position:integer, captain:boolean и wicket_keeper:boolean (Можете ли вы сказать, что я работаю над еще .. :))

Учитывая следующее :

t = Team.first 
p = Player.first(11) 
t.players << p 

Это хорошо заполняет модель TeamMembership объектами моего игрока.

Если я пытаюсь:

t.players[4][:captain] = true 

он терпит неудачу с - ActiveModel::MissingAttributeError: can't write unknown attribute captain'`

Однако, я могу установить его так:

t.team_memberships[4][:captain] = true 

Но это только кажется неправильным.

Учитывая вы должны увидеть, что я пытаюсь достичь, это:

A) Лучший способ подойти к этой задаче - если да, то есть ли способ, чтобы получить в и установить капитан атрибутов непосредственно через игрок (если это имеет смысл)

или

B) есть лучше, более «railsy» подход, который я пропускаю.

ответ

0

Я считаю, что у вас есть t.team_memberships[4][:captain] = true. Я говорю это, потому что вы заявляете в своем вопросе, что у вашей модели TeamMembership есть position:integer, captain:boolean, wicket_keeper:boolean. Поэтому из моего понимания вы заполнили модель TeamMembership. Однако со следующим: t.players[4][:captain] = true вы пытаетесь получить доступ к атрибуту капитана. Что является частью модели TeamMembership, и поэтому я пытаюсь сказать, что вы пытаетесь получить доступ к атрибуту капитан, который является атрибутом экземпляра TeamMembership. В дополнение к этому, я считаю, что эта ошибка исходит от has_many :team_memberships, который у вас есть у вашего Player, это относится к связанной модели. Я думаю, что он ищет player_id в таблице TeamMembership. Смотрите следующие ссылки, они могут помочь уточнить, что вы пытаетесь сделать:

API - Ruby on Rails - belongs_to

Guide Ruby on Rails - Belongs_to_association-reference взглянуть на раздел 4.1.2.6: foreign_key

+0

Спасибо за ответ - тем не менее, я знаю, почему ассоциация через 'team_memberships' работает - я надеялся, что будет лучший способ определить команды <-> отношения игроков ... будут читать ссылки, хотя я уже через них уже несколько раз уже !! – BenjiBoyWick