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 Silva 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 List wrote:

Joao Silva 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:

Rails List wrote:

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

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:

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

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

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

#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