What is the Ruby idiom for this?

1 view
Skip to first unread message

RVince

unread,
Nov 22, 2009, 10:25:22 AM11/22/09
to Ruby on Rails: Talk
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

Eno

unread,
Nov 22, 2009, 10:47:35 AM11/22/09
to rubyonra...@googlegroups.com
You could look at Ruby DBI or maybe you can use ActiveRecord from Rails.



--
A

RVince

unread,
Nov 22, 2009, 10:51:13 AM11/22/09
to Ruby on Rails: Talk
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.

Eno

unread,
Nov 22, 2009, 10:59:58 AM11/22/09
to rubyonra...@googlegroups.com
On Sun, 22 Nov 2009, RVince wrote:

> 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.


--
A


RVince

unread,
Nov 22, 2009, 11:10:22 AM11/22/09
to Ruby on Rails: Talk
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

Frederick Cheung

unread,
Nov 22, 2009, 12:21:40 PM11/22/09
to Ruby on Rails: Talk
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
Reply all
Reply to author
Forward
0 new messages