我正在运行Rails 4.0。 Ruby 2.0
对于注册,我只要求用户在新页面中向我提供电子邮件。
在更新操作中,我会询问用户他们的名字。
在Index操作中列出用户时,我只想显示用户已更新其名称。
我知道我需要根据用户是否更新了他们的名字来确定范围。
用户模型
scope :name, where(name: true)
用户控制器
def index
@users = User.name
end
错误
undefined method `gsub' for #
我认为问题就是问题,我称之为范围。我可能需要使用exists?
非常感谢任何帮助。谢谢。
答案 0 :(得分:3)
就个人而言,为了更加传统,我会使用
class User < ActiveRecord::Base
scope :has_name, where("users.name != ''")
end
这样,当您的模型与另一个模型连接时,如果多个表具有name
列
考虑这个例子
$ rails new app
$ cd app
$ rails g resource User name:string company_id:integer
$ rails g resource Company name:string
$ rake db:migrate
我们的模型
class User < ActiveRecord::Base
belongs_to :company
scope :has_name, where("name != ''")
end
class Company < ActiveRecord::Base
has_many :users
end
问题
$ rails c
irb> User.has_name.join(:company)
哦,不!
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN
"companies" ON "companies"."id" = "users"."company_id" WHERE
(name != '')
SQLite3::SQLException: ambiguous column name: name: SELECT
"users".* FROM "users" INNER JOIN "companies" ON
"companies"."id" = "users"."company_id" WHERE (name != '')
ActiveRecord::StatementInvalid: SQLite3::SQLException: ambiguous
column name: name: SELECT "users".* FROM "users" INNER JOIN
"companies" ON "companies"."id" = "users"."company_id" WHERE
(name != '')
让我们修复范围
class User < ActiveRecord::Base
belongs_to :company
scope :has_name, where("users.name != ''")
end
重新运行我们的查询
irb> reload!
irb> User.has_name.join(:company)
正确输出
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "companies"
ON "companies"."id" = "users"."company_id" WHERE (users.name != '')
=> []
答案 1 :(得分:1)
您可以使用:
scope :with_name, where("name <> ''")
虽然上面没有告诉你他们是否真的修改了他们的名字,但这并不是空白。如果您想跟踪名称列中的更改,可以使用PaperTrail gem之类的内容。
根据其他反馈,我建议:
scope :with_name, where("users.name != ''")