2009-06-16 27 views
2

我有一個模型Feed,它擁有並屬於許多FilteredUsers。在這種情況下,我通過has_many:through關係實現了它。has_many:通過find_or_initialize_by中斷休息

class Feed < ActiveRecord::Base 
    has_many :denials, :dependent => :destroy 
    has_many :filtered_users, :through => :denials 

我想創建一個記錄,如果它不存在或找到對象,如果它確實存在。當我嘗試使用find_or_initialize_by(或find_or_create_by)拋出一個異常說undefined method 'feed_id=' for <FilteredUser..

下面是代碼:

feed = Feed.find(params[:id]) 
user = feed.filtered_users.find_or_initialize_by_user_url(params[:user_url]) 
if params[:status] == "block" 
    feed.filtered_users << user 
else 
    feed.filtered_users.delete(user) 
end 
feed.save 

關於如何解決此問題或如何解決它乾巴巴的有什麼建議?

謝謝!

+0

看起來像這樣`initialize_by`路徑沒有意義,如果請求不是`status = block` - 爲什麼麻煩初始化記錄只是爲了`刪除`它呢? – austinfromboston 2009-06-16 21:30:26

回答

1

首先,因爲它是一個has_many :through關係,初始化無法知道其denialfiltered_user應關聯的方式。如果您要使用find_or_initialize_by,則需要在與feed關聯的特定denial上運行它。

構建一個新的filtered_user並將其與特定的拒絕相關聯。

其次,同意ErsatzRyan,一般邏輯似乎有點偏離。

0

首先檢查params [:status]然後做你需要做的事情不是更容易嗎?

feed = Feed.find(params[:id]) 
if params[:status] == 'block' 
    feed.filtered_users.build(:user_url => params[:user_url]) 
else 
    feed.filtered_users.find_by_user_url(params[:user_url]).delete 
end 
feed.save 

警告這是空氣編碼不測試