testing - Ruby on Rails - Accessing data in :has_many => :through association -


i'm trying grips type of association in rails

i have following 3 models:

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' 

i have before_create method adds new user default user group.

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 handle group_ids   def update_groups     unless group_ids.nil?       self.memberships.each |m|         m.destroy unless group_ids.include?(m.group_id.to_s)         group_ids.delete(m.group_id.to_s)       end        group_ids.each |g|         self.memberships.create(:group_id => g) unless g.blank?       end       reload       self.group_ids = nil     end   end 

i'm trying write test ensure happening correctly.

user = user.new user.username = 'testuser' user.email = 'testuser@testdomain.co.uk' user.password = 'testpass' user.password_confirmation = 'testpass' assert user.save assert user.errors.empty? assert !user.memberships.empty? 

the test passes if use user.memberships.empty, not if use user.groups.empty?. under impression should able access groups through .groups?

how test user belongs default group called 'active users'?

any advice appreciated.

thanks

you might overcomplicating default group. here's came with. users , groups have name attribute in examples, keep simple.

# 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 

you need 1 callback, before_create. , test:

# 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 

this test not checking user has some groups, exact group you're expecting, tighter check.


Comments

Popular posts from this blog

c++ - Convert big endian to little endian when reading from a binary file -

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -