Ruby on Rails - Доступ к данным в: has_many =>: через ассоциацию - PullRequest
2 голосов
/ 17 января 2010

Я пытаюсь разобраться с этим типом ассоциации в Rails

У меня есть следующие три модели:

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 = 'testuser@testdomain.co.uk'
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?

Как мне проверить, что пользователь принадлежит к группе по умолчанию «Активные пользователи»?

Любой совет будет принят с благодарностью.

Спасибо

1 Ответ

1 голос
/ 17 января 2010

Возможно, вы слишком усложняете группу по умолчанию. Вот что я придумал. Пользователи и группы имеют только атрибут name в моих примерах, чтобы было проще.

# 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. And now for the test:</p> <pre># 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

Этот тест не просто проверяет наличие у пользователя некоторых групп, но и именно ту группу, которую вы ожидаете, что является более строгой проверкой.

...