
Overwriting default_scope conditions is broken
Reported by Piotr Solnica (solnic) | February 24th, 2010 @ 06:30 AM
require 'rubygems'
require 'dm-core'
require 'spec'
DataMapper::Logger.new(STDOUT, :debug)
DataMapper.setup :default, "sqlite3::memory:"
class User
include DataMapper::Resource
property :id, Serial
property :active, Boolean
default_scope(:default).update(:active => true)
auto_migrate!
end
describe "Overwriting default scope conditions" do
before :all do
@active = User.create(:active => true)
@inactive = User.create(:active => false)
end
it "should overwrite a condition" do
users = User.all(:active => false)
users.size.should == 1
users.first.should == @inactive
end
end
The produced query looks like this:
SELECT "id", "active" FROM "users" WHERE ("active" = 'f' AND
"active" = 't') ORDER BY "id"
Comments and changes to this ticket
-
Piotr Solnica (solnic) February 24th, 2010 @ 06:48 AM
- Tag changed from default_scope bug to bug, default_scope
-
Marcin Kulik February 24th, 2010 @ 06:52 AM
I can confirm that this issue is reproducible on 0.10.2 and on master branch.
-
Martin Gamsjaeger (snusnu) February 24th, 2010 @ 02:30 PM
- State changed from unconfirmed to confirmed
- Milestone set to 1.0.0
-
Piotr Solnica (solnic) February 24th, 2010 @ 03:26 PM
- Assigned user set to Piotr Solnica (solnic)
-
Piotr Solnica (solnic) May 18th, 2010 @ 08:34 AM
- Milestone cleared.
- Tag changed from bug, default_scope to default_scope, suggestion
- State changed from confirmed to hold
- Assigned user cleared.
It's a private API so the ticket should be treated more like a suggestion to make the default_scope a public method and of course make it work correctly.
-
Dan Kubb (dkubb) May 18th, 2010 @ 01:18 PM
yeah, generally I name my private API methods as something a bit longer/uglier than I normally would for a public method. In this case what I'd probably do is make a "scope" method, mark it as public and make that part of the API.
The other thing I would like to do with the scope behaviour is make it so that the default scope is used for property defaults. So like in the above case if you did:
user = User.create user.active # => true (rather than nil)
This behaviour is consistent with how Collection works now, eg:
# NOTE: assume there is no default scope user = User.all(:active => true).create user.active # => true
-
Marcin Kulik May 18th, 2010 @ 01:51 PM
With or without using it for property defaults, it's still VERY useful and my apps strongly rely on it. I'd love to see it in public API.
-
komagata (at gmail) February 6th, 2011 @ 07:33 AM
- Milestone order changed from 0 to 0
I like default_scope too.
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »