Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
47112987
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
47112987
编写于
3月 17, 2012
作者:
J
José Valim
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #5321 from pfeiffer/uniqueness_validator_conditions
Add :conditions option to uniqueness validator
上级
21e53000
4b6daef3
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
30 addition
and
2 deletion
+30
-2
activerecord/lib/active_record/validations/uniqueness.rb
activerecord/lib/active_record/validations/uniqueness.rb
+18
-2
activerecord/test/cases/validations/uniqueness_validation_test.rb
...cord/test/cases/validations/uniqueness_validation_test.rb
+12
-0
未找到文件。
activerecord/lib/active_record/validations/uniqueness.rb
浏览文件 @
47112987
...
...
@@ -35,8 +35,14 @@ def validate_each(record, attribute, value)
relation
=
relation
.
and
(
table
[
scope_item
].
eq
(
scope_value
))
end
if
finder_class
.
unscoped
.
where
(
relation
).
exists?
record
.
errors
.
add
(
attribute
,
:taken
,
options
.
except
(
:case_sensitive
,
:scope
).
merge
(
:value
=>
value
))
relation
=
finder_class
.
unscoped
.
where
(
relation
)
if
options
[
:conditions
]
relation
=
relation
.
merge
(
options
[
:conditions
])
end
if
relation
.
exists?
record
.
errors
.
add
(
attribute
,
:taken
,
options
.
except
(
:case_sensitive
,
:scope
,
:conditions
).
merge
(
:value
=>
value
))
end
end
...
...
@@ -102,6 +108,14 @@ module ClassMethods
# validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
# end
#
# It is also possible to limit the uniqueness constraint to a set of records matching certain conditions.
# In this example archived articles are not being taken into consideration when validating uniqueness
# of the title attribute:
#
# class Article < ActiveRecord::Base
# validates_uniqueness_of :title, :conditions => where('status != ?', 'archived')
# end
#
# When the record is created, a check is performed to make sure that no record exists in the database
# with the given value for the specified attribute (that maps to a column). When the record is updated,
# the same check is made but disregarding the record itself.
...
...
@@ -109,6 +123,8 @@ module ClassMethods
# Configuration options:
# * <tt>:message</tt> - Specifies a custom error message (default is: "has already been taken").
# * <tt>:scope</tt> - One or more columns by which to limit the scope of the uniqueness constraint.
# * <tt>:conditions</tt> - Specify the conditions to be included as a <tt>WHERE</tt> SQL fragment to limit
# the uniqueness constraint lookup. (e.g. <tt>:conditions => where('status = ?', 'active')</tt>)
# * <tt>:case_sensitive</tt> - Looks for an exact match. Ignored by non-text columns (+true+ by default).
# * <tt>:allow_nil</tt> - If set to true, skips this validation if the attribute is +nil+ (default is +false+).
# * <tt>:allow_blank</tt> - If set to true, skips this validation if the attribute is blank (default is +false+).
...
...
activerecord/test/cases/validations/uniqueness_validation_test.rb
浏览文件 @
47112987
...
...
@@ -325,4 +325,16 @@ def test_validate_straight_inheritance_uniqueness
assert
w6
.
errors
[
:city
].
any?
,
"Should have errors for city"
assert_equal
[
"has already been taken"
],
w6
.
errors
[
:city
],
"Should have uniqueness message for city"
end
def
test_validate_uniqueness_with_conditions
Topic
.
validates_uniqueness_of
(
:title
,
:conditions
=>
Topic
.
where
(
'approved = ?'
,
true
))
t1
=
Topic
.
create
(
"title"
=>
"I'm a topic"
,
"approved"
=>
true
)
t2
=
Topic
.
create
(
"title"
=>
"I'm an unapproved topic"
,
"approved"
=>
false
)
t3
=
Topic
.
new
(
"title"
=>
"I'm a topic"
,
"approved"
=>
true
)
assert
!
t3
.
valid?
,
"t3 shouldn't be valid"
t4
=
Topic
.
new
(
"title"
=>
"I'm an unapproved topic"
,
"approved"
=>
false
)
assert
t4
.
valid?
,
"t4 should be valid"
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录