2010-01-17 84 views
2

我試圖去抓住這種類型的關聯在Rails的Ruby on Rails的 - 在訪問數據:的has_many =>:通過關聯

我有以下三種模式:

User 

has_many: 'memberships' 
has_many: groups, :through => 'memberships' 

Membership 

belongs_to: 'user' 
belongs_to 'group' 

Group 

has_many: 'memberships' 
has_many: 'users', :through => 'memberships' 

我有一個before_create方法,它將一個新用戶添加到默認用戶組。

user.rb 

    attr_accessor :group_ids 

    before_create :add_user_to_default_group 
    after_save :update_groups 

    def add_user_to_default_group 
     self.group_ids = [1] 
    end 



#after_save callback to handle group_ids 
    def update_groups 
    unless group_ids.nil? 
     self.memberships.each do |m| 
     m.destroy unless group_ids.include?(m.group_id.to_s) 
     group_ids.delete(m.group_id.to_s) 
     end 
     group_ids.each do |g| 
     self.memberships.create(:group_id => g) unless g.blank? 
     end 
     reload 
     self.group_ids = nil 
    end 
    end 

我想寫一個測試,以確保這是正確的發生。

user = User.new 
user.username = 'testuser' 
user.email = '[email protected]' 
user.password = 'testpass' 
user.password_confirmation = 'testpass' 
assert user.save 
assert user.errors.empty? 
assert !user.memberships.empty? 

測試通過,如果我使用user.memberships.empty,但不是如果我使用user.groups.empty ?.我的印象是,我應該可以通過.groups訪問這些組?

我如何測試用戶是否屬於名爲「活動用戶」的默認組?

任何意見將不勝感激。

謝謝

+0

你能告訴我們'before_save'方法嗎?而且我認爲你每次更新都會調用'before_create',因爲'before_save'會被調用。 – Eimantas 2010-01-17 15:07:54

回答

1

您可能會使默認組過於複雜。這是我想出來的。在我的示例中,用戶和組只有一個名稱屬性,以保持簡單。

# app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, :through => :memberships 

    before_create :add_default_group 

    protected 

    def add_default_group 
    self.groups << Group.find_by_name('Active Users') 
    end 
end 

# app/models/group.rb 
class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 
end 

# app/models/membership.rb 
class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

你只需要一個回調,before_create。而現在的測試:

# test/unit/user_test.rb 
require 'test_helper' 

class UserTest < ActiveSupport::TestCase 
    def test_user_gets_default_group 
    group = Group.create(:name => 'Active Users') 
    user = User.new(:name => 'Test') 

    assert user.save 
    assert_equal [group], user.groups 
    end 
end 

這個測試不僅是檢查用戶是否具有一些組,但你期待的確切組,這是一個更嚴格的檢查。

相關問題