Skip to content

Instantly share code, notes, and snippets.

@nicolaracco
Created March 4, 2015 10:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nicolaracco/750c63bfb4f7c5847256 to your computer and use it in GitHub Desktop.
Save nicolaracco/750c63bfb4f7c5847256 to your computer and use it in GitHub Desktop.
has_one through setter
class User < ActiveRecord::Base
has_many :memberships, inverse_of: :user
end
# ha anche il flag owner
class Membership < ActiveRecord::Base
belongs_to :user, inverse_of: :memberships
belongs_to :group, inverse_of: :memberships
end
class Group < ActiveRecord::Base
has_many :memberships, inverse_of: :group
has_one :owner_membership, -> { where owner: true }, class_name: 'Membership'
has_one :owner, source: :user, through: :owner_membership
end
require 'spec_helper'
describe Group do
describe '#owner' do
subject { Group.create! }
context 'when there are no memberships' do
it 'returns nil' do
expect(subject.owner).to be_nil
end
end
context 'when there are memberships' do
let!(:owner) { Membership.create!(user: User.create!, group: subject, owner: true) }
before { Membership.create!(user: User.create!, group: subject) }
it 'returns a user' do
expect(subject.owner).to be_a User
end
it 'returns the owner user' do
expect(subject.owner).to eq owner.user
end
end
end
describe '#owner=' do
subject { Group.create! }
context 'when there are no memberships' do
it 'adds a new membership' do
expect {
subject.owner = User.create!
}.to change(Membership, :count).to 1
end
it 'sets the new owner' do
user = User.create!
subject.owner = user
subject.reload # per sicurezza
expect(subject.owner).to eq user
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment