Problem with named_scope

2 views
Skip to first unread message

Joao Silva

unread,
Jul 23, 2009, 7:54:45 AM7/23/09
to rubyonra...@googlegroups.com
Here are my scopes:

default_scope :order => 'posted_on DESC', :conditions => { :status =>
'visible' }
named_scope :positive, :conditions => { :rating => 'positive', :status
=> 'visible' }
named_scope :neutral, :conditions => { :rating => 'neutral', :status
=> 'visible' }
named_scope :negative, :conditions => { :rating => 'negative', :status
=> 'visible' }
named_scope :ignored, :conditions => { :status => 'ignored' }

Why i'm getting ALL records when i run these scopes? Whatever scope i
run i'm getting all records, whatever i set 'visible' or 'ignored' state
:-(.
--
Posted via http://www.ruby-forum.com/.

Rails List

unread,
Jul 23, 2009, 10:07:25 AM7/23/09
to rubyonra...@googlegroups.com

How do you run them?. You should be as clear as possible to get
appropriate answers.

Joao Silva

unread,
Jul 24, 2009, 5:01:37 AM7/24/09
to rubyonra...@googlegroups.com

Migration:

create_table "messages", :force => true do |t|
t.string "rating", :default => "neutral"
t.boolean "ignored", :default => false
t.datetime "created_at"
t.datetime "updated_at"
end

Class:

class Message < ActiveRecord::Base
default_scope :order => 'posted_on DESC', :conditions => { :ignored =>
false }


named_scope :positive, :conditions => { :rating => 'positive' }

named_scope :neutral, :conditions => { :rating => 'neutral' }

named_scope :negative, :conditions => { :rating => 'negative' }

named_scope :ignored, :conditions => { :ignored => true }
named_scope :commented, lambda {
message_ids = Comment.connection.select_values("SELECT message_id
FROM comments")
{:conditions => {:id => message_ids}}
}
named_scope :today, :conditions => ['created_at BETWEEN ? AND ?',
Time.now.beginning_of_day, Time.now.end_of_day]
end

Message.ignored -> returns all records :-(

Conrad Taylor

unread,
Jul 24, 2009, 7:29:36 AM7/24/09
to rubyonra...@googlegroups.com
You can write the above three named_scope as follows:

named_scope  :rating_type, lambda { |type| { :rating => type } }

Usage:  Message.rating_type( 'positive' )
            Message.rating_type( 'neutral' )
            Message.rating_type( 'negative' )
 

 named_scope :ignored, :conditions => { :ignored => true }

The above name_scope here redefines the previous definition.
 

 named_scope :commented, lambda {
   message_ids = Comment.connection.select_values("SELECT message_id
FROM comments")
   {:conditions => {:id => message_ids}}
 }

I'm not really sure what you're trying to do here.  Are you trying to retrieve all
the message ids that have comments.  I take it that you have the following
type of association for a Comment:

class Comment  < ActiveRecord::Base

   belongs_to :message

end

If not, could you provide some more information about the Comment class and how 
Messages are associated with it?

-Conrad
 

 named_scope :today, :conditions => ['created_at BETWEEN ? AND ?',
Time.now.beginning_of_day, Time.now.end_of_day]

end

Message.ignored -> returns all records :-(

When you run the above what SQL is being generated in the logs?  This would
be a good place to look.

-Conrad

Joao Silva

unread,
Jul 24, 2009, 8:36:34 AM7/24/09
to rubyonra...@googlegroups.com
> named_scope :ignored, :conditions => { :ignored => true }


> The above name_scope here redefines the previous definition.

ok, so how i can fix it? imho this should work ,but not :-(

Conrad Taylor

unread,
Jul 24, 2009, 8:41:49 AM7/24/09
to rubyonra...@googlegroups.com
On Fri, Jul 24, 2009 at 5:36 AM, Joao Silva <rails-mai...@andreas-s.net> wrote:

>   named_scope :ignored, :conditions => { :ignored => true }


> The above name_scope here redefines the previous definition.

ok, so how i can fix it? imho this should work ,but not :-(

It really depends on what you're trying to do.  If you can post
the SQL that's being generated, we can better assist you.

-Conrad 

Joao Silva

unread,
Jul 24, 2009, 8:46:09 AM7/24/09
to rubyonra...@googlegroups.com
Conrad Taylor wrote:
> On Fri, Jul 24, 2009 at 5:36 AM, Joao Silva <
> rails-mai...@andreas-s.net> wrote:
>
>>
>> > named_scope :ignored, :conditions => { :ignored => true }
>>
>>
>> > The above name_scope here redefines the previous definition.
>>
>> ok, so how i can fix it? imho this should work ,but not :-(
>
>
> It really depends on what you're trying to do. If you can post
> the SQL that's being generated, we can better assist you.
>
> -Conrad

Ok, here is my code:

@messages = @brands.messages.ignored.paginate :per_page => 25, :page =>
params[:page]

And sql generated:

Message Load (4.0ms) SELECT * FROM `messages` WHERE
(`messages`.brand_id = 2) AND (((`messages`.`ignored` = 0)) AND
((`messages`.`ignored` = 0) AND (`messages`.brand_id = 2))) ORDER BY
posted_on DESC LIMIT 0, 25

Joao Silva

unread,
Jul 24, 2009, 8:48:18 AM7/24/09
to rubyonra...@googlegroups.com
Update:

For ignored:

@messages = @brand.messages.ignored.paginate :per_page => 25, :page =>
params[:page]

Message Load (4.0ms) SELECT * FROM `messages` WHERE


(`messages`.brand_id = 2) AND (((`messages`.`ignored` = 0)) AND
((`messages`.`ignored` = 0) AND (`messages`.brand_id = 2))) ORDER BY
posted_on DESC LIMIT 0, 25

For all:

@messages = @brand.messages.all.paginate :per_page => 25, :page =>
params[:page]

Message Load (9.5ms) SELECT * FROM `messages` WHERE
((`messages`.`ignored` = 0) AND (`messages`.brand_id = 2)) ORDER BY
posted_on DESC

Conrad Taylor

unread,
Jul 24, 2009, 9:13:10 AM7/24/09
to rubyonra...@googlegroups.com
On Fri, Jul 24, 2009 at 5:48 AM, Joao Silva <rails-mai...@andreas-s.net> wrote:

Update:

For ignored:

@messages = @brand.messages.ignored.paginate :per_page => 25, :page =>
params[:page]

Message Load (4.0ms)   SELECT * FROM `messages` WHERE
(`messages`.brand_id = 2) AND (((`messages`.`ignored` = 0)) AND
((`messages`.`ignored` = 0) AND (`messages`.brand_id = 2))) ORDER BY
posted_on DESC LIMIT 0, 25

This looks rather odd because you have the following statements specified twice:

(`messages`.brand_id = 2)
(`messages`.`ignored` = 0)

Should the named_scope, :ignored, be set to true or false?  Also, what the expected
resultset that should be returned from the following statement:

Message.ignored

I would recommend building your named_scopes one at a time to get the result that
you're looking for at each step.
 


For all:

@messages = @brand.messages.all.paginate :per_page => 25, :page =>
params[:page]

Message Load (9.5ms)   SELECT * FROM `messages` WHERE
((`messages`.`ignored` = 0) AND (`messages`.brand_id = 2)) ORDER BY
posted_on DESC

Same comments as the above.

-Conrad

Joao Silva

unread,
Jul 24, 2009, 9:42:25 AM7/24/09
to rubyonra...@googlegroups.com
From Message.ignored - all messages with ignored = false, others scopes
(message.all, message.positive, etc) - all messages with given rating
and ignored = true.

Joao Silva

unread,
Jul 24, 2009, 9:44:22 AM7/24/09
to rubyonra...@googlegroups.com
Joao Silva wrote:
> From Message.ignored - all messages with ignored = false, others scopes
> (message.all, message.positive, etc) - all messages with given rating
> and ignored = true.

Also: be default not showing records with ignored = true.

Conrad Taylor

unread,
Jul 25, 2009, 1:08:49 AM7/25/09
to rubyonra...@googlegroups.com
On Fri, Jul 24, 2009 at 6:44 AM, Joao Silva <rails-mai...@andreas-s.net> wrote:

Joao Silva wrote:
> From Message.ignored - all messages with ignored = false, others scopes
> (message.all, message.positive, etc) - all messages with given rating
> and ignored = true.

Also: be default not showing records with ignored = true.

OK, I generated at ticket:


The easiest way to fix this for now is to remove the default_scope and
rewrite the positive, neutral, and negative named scopes as you see fit.
For example, if you would like positive, neutral, and negative named scopes
to have a ignored value set to true, you can do the following:

named_scope  :rating_type, lambda { |type| { :rating => type, :ignored => true } }

Usage:  Message.rating_type( 'positive' )
            Message.rating_type( 'neutral' )
            Message.rating_type( 'negative' )

Good luck,

-Conrad
Reply all
Reply to author
Forward
0 new messages