为什么此块内的User.count始终为零?
问题描述:
只有第一个创建的用户可以是管理员。
我期待实现与user.admin = User.count == 0 ? true : false
的self.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
答
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
我认为更好的办法是通过自己在DB/seeds.rb创建一个管理员用户,然后'耙分贝:seed' – usmanali 2014-12-11 07:59:06
谢谢,但这样做,如果有人克隆项目,他们陷入了同一个管理员帐户。我试图用真实账户来做到这一点。另一种方式,可能是用户生成第一个帐户,然后从rails控制台,只需将admin更改为true,但再次,这不是目标。再次感谢! – Horacio 2014-12-11 22:01:16
不计算用户数量,并寻找User.id或User.uid - 希望第一个用户的ID为0? – knut 2014-12-12 20:12:39