2011-08-01 144 views
2

我有一個用戶從中導入數據的xml文件。這在Player模型中創建了一條記錄。 同時,我想要在Membership關聯中創建一條記錄。find_or_initialize_by和has_many:通過

以上兩種情況只有在記錄不存在的情況下才能觸發。 這是該方法的縮短版:

@player = self.players.find_or_initialize_by_name_and_archetype(name, archetype) 
if @player.save 
    self.memberships.create(:player_id => @player.id) 
end 

現在find_or_initialize_by作品,但仍然是爲每個玩家創造了一個Membership,基本上忽略了,如果條件。

如何以簡明的方式去做這件事?

回答

2

如果@player通過查找或初始化調用保存設置,它仍然可以返回true,即使它不是新記錄 - 通過查找對象在控制檯中嘗試它,不會更改任何內容,調用save on它,只要它是一個有效的對象,你仍然會變得真實。

話雖這麼說,我想你想你的病情是沿

if @player.new_record? && @player.save 
+0

謝謝隊友,我在控制檯中試了一下,它確實返回true。出於某種原因,我認爲如果只發現記錄並且沒有初始化記錄,保存將是錯誤的。 – amunds

+0

'save'只會返回false,該記錄無效(基於驗證)。很高興它解決了。乾杯。 – theIV

1

線條更恕我直言更清潔的方式將唯一性約束添加到成員的我不知道self是誰您的代碼(Team?)這樣

class Team < ActiveRecord::Base 
has_many :memberships, :before_add => :validates_membership 

我只想默默地刪除數據庫調用,並報告成功。

def validates_membership(membership) 
    raise ActiveRecord::Rollback if self.memberships.include? membership 
end 

ActiveRecord ::回滾是在內部捕獲但不重新加密。
然後,您可以撥打self.memberships.create(:player_id => @player.id)並且不會創建重複的成員資格。
如果您希望可以在數據庫級別add_index :memberships, [ :team_id, :player_id ], :unique => true, :name => 'by_team_and_player上添加唯一性約束。

最後但並非最不重要的(有些人會說你應該先做),你可以添加測試來驗證會員的唯一性。