0

我有一个属性,: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)/ 但我应该在哪里构建它?

提前致谢。

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

4

1 回答 1

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

如果您需要检查数据库中的多个值,您将无法仅使用唯一性验证,因此您必须编写一个自定义验证来为您搜索数据库。对于您的用例,您似乎可以使用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
于 2013-06-25T12:50:54.113 回答