2010-01-17 4 views
2
내가 레일에 협회의 이러한 유형의 그립을 얻으려고

을 통해 레일에 루비 - 데이터 액세스 : => 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를 사용하면 안됩니다. 나는 그룹을 통해 그룹에 액세스 할 수 있어야한다는 인상 아래에 있었습니까?

사용자가 '활성 사용자'라는 기본 그룹에 속하는지 어떻게 테스트 할 수 있습니까?

모든 조언을 주시면 감사하겠습니다.

감사합니다.

+0

'before_save' 메소드를 보여줄 수 있습니까? 그리고 나는 여러분이 before_create'라고 생각합니다. 왜냐하면 before_save'가 매번 업데이트 될 때마다 호출되기 때문입니다. – Eimantas

답변

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 

이 테스트는 사용자가 일부 그룹이 있음을 확인하지만, 엄격한 검사 당신이 기다리고있어 정확한 그룹되지 않습니다.