Rails存在的范围

时间:2013-11-08 17:50:35

标签: ruby-on-rails ruby scope exists

我正在运行Rails 4.0。 Ruby 2.0

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

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

在Index操作中列出用户时,我只想显示用户已更新其名称。

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

用户模型

scope :name, where(name: true)

用户控制器

def index
  @users = User.name
end

错误

undefined method `gsub' for #

我认为问题就是问题,我称之为范围。我可能需要使用exists?

非常感谢任何帮助。谢谢。

2 个答案:

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