searching the an array of objects


I'm trying to write some tests.

I have a complicated query for "matches"

one criteria is that one's matches should not contain someone from
your blocked list.

in testing the matches method, i'm not sure how to test this.

u = User.find(1)
u.matches.where(:user_id=>2).should be_empty

however where is an invalid method for an array, i see... And I can't
seem to do anything with the find method. Any ideas here?

Try this:

  u.matches.index { |match| match.user_id == 2 } == nil


On rereading this and then seeing the thread on asking questions,
methinks I ought to talk a bit about how I came up with this, and how
the rest of you can do likewise when stuck in a simliar situation as
the OP. As you may recall, he wanted to use find, but the method
returned an Array, which doesn't have a find method.

I figured, there's *got* to be *some* useful method on Array. There
wasn't one that I immediately recalled offhand. So I went to the docs
for the Array class, and looked at the methods. Of course there were
things like map/collect, that could be used to loop over it and return
true if it found a match or false if it hit the end, or select that
could be used to construct an array of "hit" elements. But I figured
there was probably a cleaner solution, that would still be clear and
concise, as a one-liner. I didn't know index would take a block...
and stumbling across that was the key.

Upshot: if you want to use method X, that works on class A, but you're
stuck with class B, take a quick stroll through the methods on B, and
see if there's something that can at least be used in a similar way.
If not, maybe there's even something better -- you don't have to solve
all similar problems the exact same way.


Don't forget about that Enumerable link:

u.matches.any? {|match| == 2}.should be_false

Ah, THAT'S where that was hiding! Something in the back of my brain
was saying "any", but my Ruby-fu is a touch out of date so I didn't
dredge up immediately where to look to verify that.

So, revised upshot: do the procedure I recommended on ALL applicable
classes! Start from the current thing and work up the inheritance
chain until you find something suitable.