Newbie:Differences between arrays

(graham) #1

Quick question - I have 2 arrays, one which holds the list of people who had access to a system when I last checked (OLD), and and another which is the current list of people who should have access (NEW).

Is there some neat syntax in Ruby which would allow me to find the people added in NEW who are not in OLD, and then find the people in OLD who have need to be delete as they are not in NEW?

I was going to sort the arrays and iterate through them looking for differences, but I suspect there is a really cool Ruby syntax to achieve this.. what is it?
Thx
Graham

(Derek Wyatt) #2

You want:

~ added_users = NEW - OLD

Regs,
D

graham wrote:

Quick question - I have 2 arrays, one which holds the list of

people who

had access to a system when I last checked (OLD), and and another

which

is the current list of people who should have access (NEW).

Is there some neat syntax in Ruby which would allow me to find the
people added in NEW who are not in OLD, and then find the people

in OLD

who have need to be delete as they are not in NEW?

I was going to sort the arrays and iterate through them looking for
differences, but I suspect there is a really cool Ruby syntax to

achieve

···

this.. what is it?
Thx
Graham

(Lennon Day-Reynolds) #3

You probably want something like this:

···

---
require 'set'

OLD = Set.new(%w{ someone admin blah })
NEW = Set.new(%w{ admin blah newacct })

(OLD - NEW).each { |user|
  # these users were removed...
}

(NEW - OLD).each { |user|
  # and these have been added...
}
---

-Lennon

(W. James) #4

graham wrote:

Quick question - I have 2 arrays, one which holds the list of people who
had access to a system when I last checked (OLD), and and another which
is the current list of people who should have access (NEW).

Is there some neat syntax in Ruby which would allow me to find the
people added in NEW who are not in OLD, and then find the people in OLD
who have need to be delete as they are not in NEW?

irb(main):005:0> %w(oldb newa newb) - %w(oldc oldb olda)
=> ["newa", "newb"]

irb(main):006:0> %w(oldc oldb olda) - %w(oldb newa newb)
=> ["oldc", "olda"]

(graham) #5

rcoder wrote:

You probably want something like this:

---
require 'set'

OLD = Set.new(%w{ someone admin blah })
NEW = Set.new(%w{ admin blah newacct })

......
I knew Ruby would have an easy answer. Thanks for the insight.
Graham