validates_uniqueness_of elasticsearch 持久性

Posted

技术标签:

【中文标题】validates_uniqueness_of elasticsearch 持久性【英文标题】:validates_uniqueness_of elasticsearch persistence 【发布时间】:2016-06-21 21:29:39 【问题描述】:

如何validates_uniqueness_of 进行弹性搜索持久性。我有一个带有 include 语句的模型

include Elasticsearch::Persistence::Model

我想包含一个唯一性验证,例如 validates_uniqueness_of :username

当我尝试使用 new 函数进行初始化时 NoMethodError: undefined method validates_uniqueness_of for class

追踪

undefined method `validates_uniqueness_of' for #<Profile:0x007fd83c2b8a10>
    from profile.rb:22:in `block in <class:Profile>'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:446:in `instance_exec'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:446:in `block in make_lambda'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:164:in `call'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:164:in `block in halting'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:504:in `call'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:504:in `block in call'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:504:in `each'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:504:in `call'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:778:in `_run_save_callbacks'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.4/lib/active_support/callbacks.rb:81:in `run_callbacks'
    from /Users/a6001096/.rvm/gems/ruby-2.2.2/gems/elasticsearch-persistence-0.1.8/lib/elasticsearch/persistence/model/store.rb:51:in `save'
    from (irb):5



class Profile
  include Elasticsearch::Persistence::Model

  attribute :user_id
  attribute :username, String, mapping:  index: 'not_analyzed' 
  attribute :image_url

  validates_uniqueness_of :username

end

【问题讨论】:

你能把代码粘贴到你有这个的地方吗?也请分享任何可能有用的堆栈跟踪。 添加了stacktrace和带有validates_uniqueness_of的类 【参考方案1】:

validates_uniqueness_of 是class method of ActiveRecord

您的Profile 类应该使用elasticsearch-model 来定义,就像这样

require 'elasticsearch/model'

class Profile < ActiveRecord::Base
  include Elasticsearch::Model

  attribute :user_id
  attribute :username, String, mapping:  index: 'not_analyzed' 
  attribute :image_url

  validates_uniqueness_of :username
end

【讨论】:

我没有使用任何常规数据库,而是使用弹性搜索作为持久性。另外根据此处的文档github.com/elastic/elasticsearch-rails/tree/master/…,您可以使用验证validates :title, presence: true 我在这里问的是我可以在这里使用什么其他验证,我似乎没有找到其他任何东西【参考方案2】:

在不更改Elasticsearch::Persistence::Model 的情况下,我基本上必须创建自己的验证,因为除了presence 之外我没有看到任何验证。简而言之,您必须创建一个must search 以确保它不存在

profiles = Profile.search query:bool:must:[match:username: "xxxxx"]

【讨论】:

以上是关于validates_uniqueness_of elasticsearch 持久性的主要内容,如果未能解决你的问题,请参考以下文章

Rails validates_uniqueness_of 跨越多个不区分大小写的列

devise 自定义手机号登录

Rails 3:验证组合值

Rails 模型中的条件回调?

验证多列的唯一性

Rails:从自定义验证器调用标准验证