What is the Ruby idiom for this?

I have a problem regarding an algorith, for a record I am looking for. I can do it in straight sql statements, but I am certain there is a Ruby "idion" for this (which, coming from another language, is the hardest thing about this fantastic language, getting a handle on the idiomsm the syntactic sugars).

Suppose I have a table with

channel_id int(11) associate_id int(11) battingorder int(11)

I have an id for an associate ('my_associate_id') and I want to determine if my associate is in this table with a given channel_id (my channel_id) and if not, to select the associate_id in this list whose channel_id matches my_channel_id with the lowest batting order.

Doing this in a couple of sql statements is quite trivial -- but is there a way to do it in a purely Ruby-like idiom?

Thanks, RVince

You could look at Ruby DBI or maybe you can use ActiveRecord from Rails.

See, I don't htink there IS an easier way -- just a Ruby-occluded way called .find_by_sql(["select ..."])

A lot of this syntactic sugar really gets in the way. Rails is great, as a web framework -- far superior to something like Struts. But in the end, it;s back to JRuby, writing the back end in the C-like syntax of Java, and avoiding Ruby and it's idioms, making use of Rails this way.

I wasn't saying use Rails, just ActiveRecord. And DBI is fairly light and gives you database independance.

You know what an ORM is right? That's really nice syntactic sugar.

Yes, ORMs are wonderful, once you learn the abstraction layer. But -- and I know some will take offense at this -- there are things to avoid in learning Ruby, and just use the old tried-n-true (many things, like using straight Javascript for most of the Ajax-like things you want to do, or for db-query-b ased algorithms, like I am trying to accomplish here, sticking with as straight of an sql interface as possible). This is true of most languages, if you can learn a more generic means of implementing the language, you are not only up-to-speed faster, BUT, you generally have a finer-grained control over what you ware implementing.

The algorithm I am looking to sweeten of:

        # Is the associate in the list - if not, make it the person at the top of the list.         @up = Up.find(params[:id]) #get the individual up record which has the associate and channel   @associate = @up.associate #specify ref to the associate in question         #see if this associate is in the current list   @Qplayers = Qplayer.find_by_sql(["select * from qplayers where associate_id=? and channel_id=? and inlist=1",@associate.id,@associate.channel_id])   if @Qplayers[0].blank? #if the associate from the up in the row is in the list, it wont be blank     @Qplayers = Up.find_by_sql(["select * from qplayers where channel_id=? and inlist=1 order by battingorder ASC",@up.channel_id])     @Qplayer = @Qplayers[0]     @associate = @Qplayer.associate   end

I'm not sure can be more clearly expressed in a "sweeter" way, especially if the criteria changes in the future -R.Vince

Yes, ORMs are wonderful, once you learn the abstraction layer. But -- and I know some will take offense at this -- there are things to avoid in learning Ruby, and just use the old tried-n-true (many things, like using straight Javascript for most of the Ajax-like things you want to do, or for db-query-b ased algorithms, like I am trying to accomplish here, sticking with as straight of an sql interface as possible). This is true of most languages, if you can learn a more generic means of implementing the language, you are not only up-to-speed faster, BUT, you generally have a finer-grained control over what you ware implementing.

The algorithm I am looking to sweeten of:

    \# Is the associate in the list \- if not, make it the person at

the top of the list. @up = Up.find(params[:id]) #get the individual up record which has the associate and channel @associate = @up.associate #specify ref to the associate in question #see if this associate is in the current list @Qplayers = Qplayer.find_by_sql(["select * from qplayers where associate_id=? and channel_id=? and inlist=1",@associate.id,@associate.channel_id])

    if @Qplayers\[0\]\.blank? \#if the associate from the up in the row is in

the list, it wont be blank @Qplayers = Up.find_by_sql(["select * from qplayers where channel_id=? and inlist=1 order by battingorder ASC",@up.channel_id]) @Qplayer = @Qplayers[0] @associate = @Qplayer.associate end

I'm not sure can be more clearly expressed in a "sweeter" way, especially if the criteria changes in the future -R.Vince

I wouldn't resort to find_by_sql for this - just a normal find :all keeps things clean, and plays nicely with scopes and so on. It seems to me that you could make this a little more succinct by playing around with named_scope and similar tools, eg add

named_scope :in_list, :conditions => {:inlist => true} named_scope :in_channel, lambda {|channel_id| {:conditions => {:channel_id => channel_id}}} to Qplayer And then you can write something like

@qplayer = @associate.q_players.in_list.in_channel (@associate.channel_id).first if !@qplayer   @qplayer = Qplayer.inlist.in_channel (@up.channel_id).find :first, :order -> 'batting_order asc' end

Fred