Removing values from a select (drop-down) box


#1

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!


#2

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.


#3

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!


#4

Sent from my iPhone

On 16 Oct 2008, at 22:44, Neal L removed_email_address@domain.invalid wrote:

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


#5

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…

Fred

Thanks!