Skip to content

Commit

Permalink
Merge pull request DavyJonesLocker#300 from onomojo/master
Browse files Browse the repository at this point in the history
Fixing bad AREL
  • Loading branch information
bcardarella committed Apr 2, 2012
2 parents c9d1d20 + 1db9f7b commit 798d8dc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/client_side_validations/active_record/middleware.rb
Expand Up @@ -30,7 +30,11 @@ def self.is_unique?(klass, attribute, value, params)

(params[:scope] || {}).each do |attribute, value|
value = type_cast_value(klass, attribute, value)
relation = relation.and(t[attribute].eq(value))
if relation.is_a?(Arel::Nodes::SqlLiteral)
relation = Arel::Nodes::SqlLiteral.new("#{relation} AND #{t[attribute].eq(value).to_sql}")
else
relation = relation.and(t[attribute].eq(value))
end
end

!klass.where(relation).exists?
Expand Down
18 changes: 18 additions & 0 deletions test/active_record/cases/test_middleware.rb
Expand Up @@ -85,6 +85,24 @@ def test_mysql_adapter_uniqueness_when_id_is_given
assert_equal 'true', last_response.body
end

def test_mysql_adapter_uniqueness_when_id_is_given_with_scope
user = User.create(email: 'user@test.com', name: 'Brian')
ActiveRecord::ConnectionAdapters::SQLite3Adapter.
any_instance.expects(:instance_variable_get).
with("@config").
returns({:adapter => "mysql"})

sql_without_binary = "#{User.arel_table["email"].eq(user.email).to_sql} AND #{User.arel_table.primary_key.not_eq(user.id).to_sql} AND #{User.arel_table["name"].eq(user.name).to_sql}"
relation = Arel::Nodes::SqlLiteral.new("BINARY #{sql_without_binary}")

#NOTE: Stubs User#where because SQLite3 don't know BINARY
result = User.where(sql_without_binary)
User.expects(:where).with(relation).returns(result)

get '/validators/uniqueness', { 'user[email]' => user.email, 'scope' => {'name' => user.name}, 'case_sensitive' => true, 'id' => user.id}
assert_equal 'true', last_response.body
end

def test_uniqueness_when_scope_is_given
User.create(:email => 'user@test.com', :age => 25)
get '/validators/uniqueness', { 'user[email]' => 'user@test.com', 'scope' => { 'age' => 30 }, 'case_sensitive' => true }
Expand Down

0 comments on commit 798d8dc

Please sign in to comment.