2011-09-14 194 views
1

我以前在舊的Rails應用程序中使用過has_and_belongs_to_many關聯,但我正在轉向使用has_many :: through來創建新的和當前的應用程序。但是,我相信我錯過了has_many的核心:通過Rails 3中的關聯。Rails 3 has_many的問題has_many:通過關聯和視圖/表單

目前,我正在爲我們城鎮的志願者消防部門構建一個應用程序。當我們開會時,我們要檢查一下消防員是否在場,放棄或不在場。

我的模型:

#FireFighter Model 
class FireFighter < ActiveRecord::Base 
has_many :attendance_meetings 
has_many :meetings, :through => :attendance_meetings 
accepts_nested_attributes_for :meeting 

#Meeting Model 
class Meeting < ActiveRecord::Base 
has_many :attendance_meetings 
has_many :fire_fighters, :through => :attendance_meetings 
accepts_nested_attributes_for :fire_fighter 

#AttendanceMeeting Model 
class AttendanceMeeting < ActiveRecord::Base 
attr_accessor :status # this is the added property on the join model that we need populated 
belongs_to :fire_fighter 
belongs_to :meeting 

我遇到的問題是如何在視圖中設置此。目前,我有:

= hidden_field_tag "meeting[fire_fighter_ids][]" 
[email protected]_fighters.each do |fire_fighter| 
    = fire_fighter.fire_fighter_name 
    %span.radio_btn= radio_button_tag :fire_figher_ids, fire_fighter.id, "present" 
    present 
    %span.radio_btn= radio_button_tag :fire_figher_ids, fire_fighter.id, "excused" 
    excused 
    %span.radio_btn= radio_button_tag :fire_figher_ids, fire_fighter.id, "absent" 
    absent 
    %br 

這將吐出的每個消防戰士和三個單選按鈕,每個消防員(與目前的選擇,爲自己開脫,或不存在)。然而,由此產生的單選按鈕的名稱都是一樣的,所以你只能選擇一個消防戰士。

正如我上面提到的,我覺得我缺少一些基本的東西,但我很難過。我已經閱讀了大量的SO問題以及ActiveRecord上Rails 3 Way書的章節。任何建議或方向將不勝感激。謝謝!

回答

1

它應該是這樣的:

class Meeting < ActiveRecord::Base 
    has_many :attendance_meetings 
    has_many :fire_fighters, :through => :attendance_meetings 
    accepts_nested_attributes_for :attendance_meetings 

# view 
= form_for @meeting do |f| 
    = f.fields_for :attendance_meetings do |f_a_m| 
    = f_a_m.object.fire_fighter.name 
    = f_a_m.check_box :status, 'present' 
    = f_a_m.check_box :status, 'excused' 
    = f_a_m.check_box :status, 'absent' 

對於你正在做你需要建立與本次會議的每個消防員的關聯方式。例如:

@meeting.firefighters << Firefighter.all 

但是,這看起來並不是特別理想。對於那些缺席(t)或原諒(f)而現在不包括在內的人,我會用布爾:狀態來形成連接,想象它像meeting_absentees。似乎落後,但這樣你的表格將會有更少的行。

+0

謝謝!我很欣賞這種迴應,現在正在嘗試這種方法。我一直認爲我在形式上的錯誤關聯(fire_fighters v。attendance_meeting)。 –

+0

不幸的是,它不適合我,但我相信,我的模型中有一些不妥之處。 –

+0

你收到了什麼錯誤? – mark