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) }