Problem with named_scope

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

Joao S. wrote:

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

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

Rails L. wrote:

Joao S. wrote:

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

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

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 :frowning:

On Fri, Jul 24, 2009 at 2:01 AM, Joao S. <
[email protected]> wrote:

=> ‘visible’ }
named_scope :negative, :conditions => { :rating => ‘negative’, :status
=> ‘visible’ }
named_scope :ignored, :conditions => { :status => ‘ignored’ }

 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’ }

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 :frowning:

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

-Conrad

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 :frowning:

On Fri, Jul 24, 2009 at 5:36 AM, Joao S. <
[email protected]> 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 :frowning:

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

Conrad T. wrote:

On Fri, Jul 24, 2009 at 5:36 AM, Joao S. <
[email protected]> 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 :frowning:

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

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

On Fri, Jul 24, 2009 at 5:48 AM, Joao S. <
[email protected]> wrote:

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

Same comments as the above.

-Conrad

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

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

On Fri, Jul 24, 2009 at 6:44 AM, Joao S. <
[email protected]> wrote:

Joao S. 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:

#2953https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2953

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