Removing values from a select (drop-down) box

Hello,

I am working on a project, and on one form we have a select (drop-
down) box where the user needs to be able to select from a list of
clients. The box is currently being populated with:

<%= collection_select(:client, :id, @account.clients, :id, :name) %>

The problem is that some of these clients may have already been
selected, and we need to remove them from the list. Is this possible?

Thanks!

Do clients have a .selected property or some such that you can use to figure out which clients are already selected? If so you could do, e.g.,

  @account.clients.map{|c| !c.selected}

I would think.

That sort of worked, it returned an array of true, false values
corresponding to !c.selected. That did help me figure out the
solution though. Here's what worked:

@account.clients.map{ |c| !c.can_edit(@unit) ? c : nil }.compact

I didn't have a selected property, but I did have a can_edit(unit)
method that returns true or false. Clients that can_edit the @unit
are already on the list...

Only thing is, this runs a separate database query for each client for
the can_edit(@unit) call. Is there any way to do this in one query?

Thanks!

That sort of worked, it returned an array of true, false values
corresponding to !c.selected. That did help me figure out the
solution though. Here's what worked:

@account.clients.map{ |c| !c.can_edit(@unit) ? c : nil }.compact

Sounds like you're looking for the reject function.

I didn't have a selected property, but I did have a can_edit(unit)
method that returns true or false. Clients that can_edit the @unit
are already on the list...

Only thing is, this runs a separate database query for each client for
the can_edit(@unit) call. Is there any way to do this in one query?

That depends entirely on what's in your can_edit function.

Fred

>
> That sort of worked, it returned an array of true, false values
> corresponding to !c.selected. That did help me figure out the
> solution though. Here's what worked:
>
> @account.clients.map{ |c| !c.can_edit(@unit) ? c : nil }.compact
>

Sounds like you're looking for the reject function.

Ach, right--or select maybe:

  @account.clients.select{|c| c.can_edit(@unit)}

Sorry for the bum steer.

> I didn't have a selected property, but I did have a can_edit(unit)
> method that returns true or false. Clients that can_edit the @unit
> are already on the list...
>
> Only thing is, this runs a separate database query for each client for
> the can_edit(@unit) call. Is there any way to do this in one query?
>
That depends entirely on what's in your can_edit function.

If your controller is doing an Account.find() to populate your @account var, you may be able to avoid the extra queries by throwing a :include => 'clients' on there...