2014-12-11 63 views
1

只有第一个创建的用户可以是管理员。

我期待实现与user.admin = User.count == 0 ? true : falseself.from_omniauth(auth)方法内,但由于某些原因,它并没有不管有多少用户无我有,管理员始终设置为true为什么此块内的User.count始终为零?

要确保没有用户:

轨控制台

User.destroy_all 
User.count 
=> 0 

user.rb

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
    user.email  = auth.info.email 
    user.password = Devise.friendly_token[0,20] 
    user.email  = auth.info.email 
    user.image  = auth.info.image 
    user.name  = auth.info.name 
    user.nickname = auth.info.nickname 
    user.admin  = User.administrator? 
    end 
end 

def self.administrator? 
    count == 0 
end 

schema.rb

create_table "users", force: true do |t| 
    ... 
    t.boolean "admin",     default: false 
    end 


谢谢!

现在它以预期的方式工作,但最初的问题仍然没有答案。

即使我不太喜欢这个解决方案,至少现在工作。

我在这里创建这个user_qty变量以外的块。

def self.from_omniauth(auth) 
    user_qty = User.count 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
    user.password = Devise.friendly_token[0,20] 
    user.email  = auth.info.email 
    user.image  = auth.info.image 
    user.name  = auth.info.name 
    user.nickname = auth.info.nickname 
    user.admin  = user_qty == 0 
    end 
end 
+0

我认为更好的办法是通过自己在DB/seeds.rb创建一个管理员用户,然后'耙分贝:seed' – usmanali 2014-12-11 07:59:06

+0

谢谢,但这样做,如果有人克隆项目,他们陷入了同一个管理员帐户。我试图用真实账户来做到这一点。另一种方式,可能是用户生成第一个帐户,然后从rails控制台,只需将admin更改为true,但再次,这不是目标。再次感谢! – Horacio 2014-12-11 22:01:16

+0

不计算用户数量,并寻找User.id或User.uid - 希望第一个用户的ID为0? – knut 2014-12-12 20:12:39

回答

1

first_or_create块内部的代码在当前范围内执行。在ActiveRecord::Relation,该first_or_create方法调用create方法,它使用scoping

def create(*args, &block) 
    scoping { @klass.create(*args, &block) } 
end 

而且scoping方法说给current_scope内运行。

此块内User.count调用像调用:

User.where(provider: auth.provider, uid: auth.uid).count 

如果用调试:

where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
    puts "current_scope: #{current_scope}" 

你应该看到:

current_scope: SELECT "users".* FROM "users" WHERE "users"."provider" = '<value1>' AND "users"."uid" = '<value2>' 

如果你想询问first_or_create区块内的所有用户的全部计数,您可以执行某些操作像:

where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
    ... 
    user.admin = User.unscoped.count == 0 ? true : false 
+0

感谢这么好的解释。 – Horacio 2014-12-13 02:46:11