2012-05-23 194 views
0

我有兩種模式,會議和與會者共享habtm關係。我還有一個會議可以屬於的用戶模型(作爲會議組織者)。rails habtm協會實施問題

class Meeting < ActiveRecord::Base 
    belongs_to :organizer, :class_name => User, :foreign_key => "organizer_id" 
    has_and_belongs_to_many :attendees, :class_name => User, :association_foreign_key => "attendee_id" 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :meetings, :class_name => Meeting, :association_foreign_key => "meeting_id" 
end 

,然後我有關係表..

create_table "attendees_meetings", :id => false, :force => true do |t| 
    t.integer "attendee_id" 
    t.integer "meeting_id" 
end 

當我創建一個新的會議,然後引用與會者爲meeting.attendees,我得到一個錯誤。與組織者,meeting.organizer同樣的事情會引發錯誤。我沒有正確設置關係嗎?

m = Meeting.create(:subject => "Test", :location => "Neverland", :body => "A test", :organizer_id => 8) 
m.organizer 
NoMethodError: undefined method `match' for #<Class:0x00000103d8cf08> 

和與會者同樣的(雖然我沒有在目前定義的,但不應該拋出一個錯誤)

1.9.2-p318 :014 > m.attendees 
(Object doesn't support #inspect) 
=> 
+0

如果您評論':attendees'關聯,您是否仍然在創建會議時遇到問題?另外,':class_name'應該包含一個字符串('「User」)而不是實際的類('User')。 – PinnyM

回答

0

has_and_belongs_to_manyclass_name選項應該是一個字符串,它是班級名稱。你已經傳遞了類對象本身。因此,例如,

has_and_belongs_to_many :attendees, 
    :class_name => "User", 
    :association_foreign_key => "attendee_id" 

我想你可能還需要在您的User模型上has_and_belongs_to_many聲明添加:foreign_key => 'attendee_id'因爲它是默認的可以刪除:association_foreign_key選項。其實你也可能會失去:class_name選項,因爲這也是默認選項。所以:

has_and_belongs_to_many :meetings, 
    :foreign_key => "attendee_id" 
+0

我有一些進展。我使用字符串更改類名進行了更改,似乎解決了正在定義的meeting.organizer問題。我還注意到我的關聯表需要是meetings_users,而不是attendees_meetings。 SQLite3 :: SQLException:no such column:meetings_users.user_id:SELECT「users」。* FROM「users」INNER JOIN「meetings_users」ON「users」。「id我在遇到meeting.attendees問題時仍然遇到問題。 「=」meetings_users「。」user_id「WHERE」meetings_users「。」attendee_id「= 26 – absolutskyy

+0

我的關聯表中的字段應該是meeting_id和attendee_id,還是meeting_id和user_id? – absolutskyy

+0

如果表是meetings_users,那麼我認爲它應該是meeting_id和user_id。但是,如果您指定':join_table =>'attendees_meetings'',則可以使用attendees_meetings。對不起,我錯過了你的問題。 – Shadwell