Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 创建默认作用域以使参数失效的好方法是什么?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 创建默认作用域以使参数失效的好方法是什么?

Ruby on rails 创建默认作用域以使参数失效的好方法是什么?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,例如,假设您总是在保存之前关闭用户电子邮件 找到 User.find_by(email: params[:email].downcase) 但我不想每次我发现的时候都把它写下来 另外,我不想要不区分大小写的搜索 而且,它应该是可组合的,并与where一起工作。比如说, User.where(email: params[:email], status:'active') 您可以为此定义一个范围: class User < ActiveRecord::Base scope :with_

例如,假设您总是在保存之前关闭用户电子邮件

找到

User.find_by(email: params[:email].downcase)
但我不想每次我发现的时候都把它写下来


另外,我不想要不区分大小写的搜索

而且,它应该是可组合的,并与where一起工作。比如说,

User.where(email: params[:email], status:'active')

您可以为此定义一个范围:

class User < ActiveRecord::Base
  scope :with_email, lambda { |email| where(email: email.downcase) }

最终你可以这样做:

# in User model
def self.normalized_search(search_attrs = {})
  searchable_attributes = [:username, :email, :first_name, :last_name]
  scope = self.scoped
  search_attrs.each do |attr, value|
    next unless searchable_attributes.include?(attr.to_sym)
    next if value.blank?

    scope = scope.where(attr.to_sym => value.to_s.downcase)
  end
  scope
end
然后你可以使用:

User.normalized_search({email: 'HeyHo@santa.com', username: 'Santa'})
此代码非常灵活:您可以轻松地添加/删除属性以允许对其进行搜索,您可以轻松地将链接的
where
(在每个属性之间添加一个“AND”子句)替换为手动编写的SQL查询,并改为使用“OR”等


如果希望(几乎)每次都使用列的值应用默认范围,可以使用
default\u范围

class User < ActiveRecord::Base
  default_scope { where(is_admin: false) }
class用户
然后调用
User.where(something:some\u variable)
将排除
User
记录,其中
是\u admin
true
。要忽略默认范围,请使用
User.unscoped.where(…)


有关
default\u scope
的更多信息:

如果在保存之前总是关闭用户电子邮件,为什么不需要不区分大小写的搜索?(电子邮件不区分大小写)我不想要不区分大小写的搜索,因为它已经不区分大小写了。我认为你应该告诉我们你到底想要什么,而不是给出用户和电子邮件的示例。也许有另一种方法可以实现你想要的,但我希望它是一个默认范围。你说的默认范围是什么意思?每次都必须将参数传递给作用域,因为
email
是可变的;如果您有一个静态参数,请使用
default\u scope
:默认范围是指查询的范围是隐式的:“在您的模型中使用此宏为模型上的所有操作设置默认范围。”您似乎在说默认范围与范围参数不兼容…?事实上,
default\u作用域
无法接收参数。我不完全理解你想要什么,你能在你最初的问题中告诉我们你想要实现什么吗?目标是对某些字段的搜索条件进行降级,因为它们在保存之前总是被降级。但命名作用域并不是一种很好的方法。所以我想寻找方法是最好的方法。。。
class User < ActiveRecord::Base
  default_scope { where(is_admin: false) }