ИМХО, более чистым способом было бы добавить ограничение уникальности к членству, если я не знаю, кто 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
.
И, наконец, что не менее важно (некоторые скажут, что вы должны сделать это в первую очередь), вы можете добавить тесты для проверки уникальности членства.