uniqueness validation perplexity

I want to write a validate routine to check to enforce that a position
must be unique in a category. (In another category, it doesn't have
to and shouldn't need to be unique.) I write this code which works
happily for new items:

def position_in_category_not_unique
  @items = Item.find( :all, :conditions => [ "category_id = ? AND
position = ?", category_id, position ] )
    if @items.size > 0
      errors.add_to_base...

If, however, I try to *update* an existing item, because it's already
in the database, it gives the error.

Any suggestions on how to approach this? It's a conceptual question.
Do I handle this through the controller somehow?

Many, many, many TIA if you tackle this one :slight_smile:
Craig

If, however, I try to *update* an existing item, because it's already
in the database, it gives the error.

What error are you seeing? What code are you running to update the item?

Any suggestions on how to approach this? It's a conceptual question.
Do I handle this through the controller somehow?

If it's a validation check, it should be in the model.

Colin

I want to write a validate routine to check to enforce that a position
must be unique in a category. (In another category, it doesn't have
to and shouldn't need to be unique.) I write this code which works
happily for new items:

def position_in_category_not_unique
@items = Item.find( :all, :conditions => [ "category_id = ? AND
position = ?", category_id, position ] )
if @items.size > 0
errors.add_to_base...

If, however, I try to *update* an existing item, because it's already
in the database, it gives the error.

Any suggestions on how to approach this? It's a conceptual question.
Do I handle this through the controller somehow?

You could add a condition along the lines of AND id != self.id. Or
you could use validates_uniqueness of, which already handles this.

Fred

Many thanks, Colin & Frederick--I ended up with this:

  def position_in_category_not_unique
    @items = Item.find( :all, :conditions => [ "category_id = ? AND
position = ?", category_id, position ] )
    single = Item.first( :all, :conditions => [ "category_id = ? AND
position = ?", category_id, position ] )
    if @items.size > 1 || ( single && single.id != id )
      errors.add_to_base "Position #{ position } already exists in #
{ Category.find( category_id ).header }."
    end
  end

Which works, but seems ugly. Frederick--I'm not sure how to use
validates_uniqueness_of with more than one field--can that be done?

Again, many thanks,
Craig

Dudebot wrote:
[...]

Frederick--I'm not sure how to use
validates_uniqueness_of with more than one field--can that be done?

I'm going to suggest that you spend less time posting here and more time
reading docs. 20 seconds of reading the documentation for
validates_uniqueness_of would have told you about the :scope option.
Look it up. :slight_smile:

Again, many thanks,
Craig

On Sep 25, 9:35�pm, Frederick Cheung <frederick.che...@gmail.com>

Best,

I appreciate the help, Marnen. In fact, I have http://api.rubyonrails.org/
permanently up while coding rails, and it's the tab to the left of my
email as I write this. I always go first to it, then the guides, then
a Google search, and only then do I post here. However, as one new to
rails, I don't "get it" yet. Unlike ruby, rails is all about
nomenclature and formalisms. I'm still learning those, and it was
easy to overlook the ":scope" option when I re-read
"validates_uniqueness_of"'s documentation for the fourth time. You
may forget what it was like to first enter rails, but in a formalism
rich environment, human navigation can be priceless--as it was in your
post. So, thanks.
Craig

Dudebot wrote:

I appreciate the help, Marnen. In fact, I have
http://api.rubyonrails.org/
permanently up while coding rails, and it's the tab to the left of my
email as I write this. I always go first to it, then the guides, then
a Google search, and only then do I post here. However, as one new to
rails, I don't "get it" yet.

I understand. The hardest thing for me has often been finding features
I know must exist, but whose names I don't know.

Unlike ruby, rails is all about
nomenclature and formalisms.

Not really, except in some limited parts of the framework.

I'm still learning those, and it was
easy to overlook the ":scope" option when I re-read
"validates_uniqueness_of"'s documentation for the fourth time.

If on the fourth reading, you are overlooking things, then perhaps your
docs reading skills are at issue here.

And I'm not trying to be snarky by saying that. I just want to remind
you that getting the most out of something like Rails is not only a
question of technical skills.

You
may forget what it was like to first enter rails,

I do not. I know that it can be tough.

but in a formalism
rich environment, human navigation can be priceless

Agreed. The only reason I responded with "RTFM" was that in this case,
you clearly knew the name of the function you needed to call, so you
would know where to look.

--as it was in your

post. So, thanks.

You're welcome.

Craig

Best,

Oh, I definitely admit that my "docs reading skills" are imperfect!
Maybe in my next life I'll be granted the get-it-all-at-once-when-
reading gift, but not in this one :slight_smile: Anyway, you helped me cut out
unnecessary code and I learned quite a bit in the process, so I am
grateful.

Have you ever considered reading the Rails source code? Not everything,
of course, but some of the bits and pieces that interest you and that
give you trouble. Spent as much or as little time as you like and
you'll find it is well spent. Reading and understanding the source is
within the reach of every programmer seriously working with Rails.

There are about three places that are truly involved (in the 2.x
series): joins and associations in ActiveRecord, view templates, and
routing. So don't start your reading at the deep end and you'll be
fine.

I'm making this suggestion every once in a while and usually the
reaction is not particularly heartfelt. Anyway, don't take this
personally, see it as an invitation, not an exhortation.

Michael

Michael Schuerig wrote:

Have you ever considered reading the Rails source code? Not everything,

...

Actually, I usually do--I come to rails after several years of coding
in ruby, so I find it interesting how things are done, and there's
much to be learned from how rails uses ruby. I'm just having this
really hard time navigating the docs. Don't get me wrong--I think the
docs are great, and I can't imagine how such a feature rich
environment could be doc'd differently--it's just very difficult for
me the newbie (not necessarily any newbie, probably just me) to figure
out how to use them well. I'm still waiting for that lightbulb moment
(like the one that happened with the C++ STL so long ago) where I know
where to look and how to use what I find. Oddly, I never needed it
with ruby itself--I just sort of used the docs naturally from day 1.

Case in point: last night I was trying to figure out how to implement
a drop-down list for fields from a single db. I'm using
collection_select elsewhere in the code to reference 1 db linked to
another, but I wanted to pull an id from a single db in a drop down
list. I finally gave up after several hours of reading the docs,
searching and trying different things. I could have built an array
from the db, then used another _for_select method I suppose, but I
just know a better way exists, and so I put it on the back burner as
I've recently been scolded for posting too much here. I know that
someday when I learn how to do it, I'll hit myself on the side of my
head like I've done so often with rails and say, "I didn't see
*that*"? But that great chasm between problem and solution seems
especially wide for rails for me. What makes it truly frustrating of
course is that rails solutions are so simple and beautiful, so I
always know a good one is lurking out there, just beyond my grasp.

Anyway, I'm likely just dense as a brick. Thanks, though, to everyone
who have patiently answered my questions with really nice, long
replies and sample code--they've been priceless. I couldn't have
built this project (obviously my first rails one) without your help.

Craig

If you're using the ones at api.rubyonrails.org, then *of course* you're
having trouble navigating them. Tryhttp://www.railsbrain.comorhttp://www.railsapi.com-- same info, but more easily searchable.

That's very useful, many thanks. Bookmark x 2!

Read docs for whole classes, not just isolated methods. That will help.

I have! and the preambles, similar methods, etc. I always start at
the top, then look down :slight_smile:

Ruby and Rails are more than just collections of methods. Read the
class preambles (Rails) and the pickaxe book (Ruby), and make sure you

I learned Ruby from the pickaxe book when there were no other docs
around :slight_smile: Ruby is my go-to language now--I just maintained a bit of
non-Rails code this afternoon before turning back to this list,
discovering (OT, sorry) that Snow Leopard broke the Tk bindings.
Bleacch. But there is a difference between the structures that Ruby
allows you to do and what Rails needs you to do. In Ruby, you can do
something inelegant, but it works. That can be useful when you're new
to something, as you can get your feet wet, and then as you understand
what kinds of pithy expressions can replace the inelegant ones and
why, you "grow into" the language. Rails seems to be like that to an
extent, but the learning curve is steep. That's obviously a
consequence of one being a framework built on the other, but
nonetheless Rails seems harder to learn. It's OK--I may be dense as a
brick, but I'm stubborn, too.

If you're referring to my scolding,...

Actually as far as a RTFM post goes, it was extraordinarily
delicate :slight_smile: It was more of darned-if-I'm-going-to-look-like-an-idiot-
again-tonight last night, but today I'm apparently back to happily
looking like an idiot.

Thanks for the links!
Craig