1

我正在运行 Rails 4.0。红宝石 2.0

对于注册,我只要求用户在新页面中向我提供电子邮件。

在更新操作中,我会询问用户的姓名。

在索引操作中列出用户时,我只想显示用户已经更新了他们的名字。

我知道我需要根据用户是否更新了他们的名字来确定范围。

用户模型

scope :name, where(name: true)

用户控制器

def index
  @users = User.name
end

错误

undefined method `gsub' for #

我认为问题在于方式,我称之为范围。我可能需要使用exists?

任何帮助是极大的赞赏。谢谢你。

4

2 回答 2

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 != '')

=> []
于 2013-11-08T18:22:13.500 回答
1

你可以使用:

scope :with_name, where("name <> ''")

虽然上面没有告诉你他们是否真的修改了他们的名字,只是它不是空白的。如果您想跟踪名称列的更改,您可以为此使用PaperTrail gem之类的东西。

根据其他反馈,我建议:

scope :with_name, where("users.name != ''")
于 2013-11-08T18:00:35.393 回答