我有一个属性: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)/但我应该在哪里构建它?
提前致谢。
编辑:
应该存在客户端验证。
答案 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