Ruby on Rails,验证与字符串连接的属性的唯一性

时间:2013-06-25 12:45:44

标签: ruby-on-rails validation client-side

我有一个属性:group_name,必须在客户端验证其唯一性。 但首先,我需要将一个字符串附加到属性,然后才对其进行验证。拜托,不要问我为什么,我需要它=)

我有一张表格:

 <%= form_for Group.new, url: what_to_do_groups_path ,method: :get ,:validate => true do |f| %>
 <div class="field_label">
<%= f.label :group_name%>
</div>
<div class="field">
<%=f.text_field :group_name %>
</div>
<%= submit_tag "Submit",  :commit =>"submit" %>

<br class="clear" />
<br />
<%end%>

控制器:

attr_accessible  :group_name
validates :group_name,      :uniqueness => { :case_sensitive => false}

因此,用户输入“RedBull”。 :group_name的值为“RedBull”。我想附加一个字符串“_Marc”并且只在数据库中验证(客户端),如果有另一个名为“RedBull_Marc”的组 我该怎么办?

我可以这样做吗?

validates :group_name+"_Marc",      :uniqueness => { :case_sensitive => false}

如果我有多个字符串要附加,以便检查这些组是否已经在数据库中。 就像我想检查数据库中是否有“RedBull_Marc”或“RedBull_Kate”一样 所以我可以用正则表达式来做,像这样:/ _(Marc | Katja)/但我应该在哪里构建它?

提前致谢。

编辑:
应该存在客户端验证。

1 个答案:

答案 0 :(得分:1)

您可以使用before_validation挂钩在验证之前修改属性。您也可以编写自己的自定义验证来进行连接,但最好使用before_validation,因为它就是它的意思。

模特:

class User < ActiveRecord::Base
  attr_accessible :group_name

  validates :group_name, :uniqueness => { :case_sensitive => false}

  before_validation :add_to_group_name

  protected
  def add_to_group_name
    self.group_name = group_name + '_Marc' # Edit however you want to here
  end
end

如果您需要检查数据库中的多个值,您将无法仅使用唯一性验证,因此您必须编写一个custom validation来搜索数据库。对于您的用例,您似乎可以使用like查询:

# % is a wildcard character and matches anything
# So group_name + "%" will match anything starting with group_name
User.where("group_name like ?", group_name + "%") 

因此,您的模型将进行自定义验证:

class User < ActiveRecord::Base
  attr_accessible :group_name

  validate :check_group_name_uniqueness

  def check_group_name_uniqueness
    if User.where("group_name like ?", group_name + "%").count > 0
      errors.add(:group_name, "is already taken")
    end
  end
end
相关问题