relations_test.rb 19.7 KB
Newer Older
1
require "cases/helper"
2
require 'models/tagging'
3 4
require 'models/post'
require 'models/topic'
5
require 'models/comment'
6 7
require 'models/reply'
require 'models/author'
8
require 'models/comment'
9 10 11
require 'models/entrant'
require 'models/developer'
require 'models/company'
12
require 'models/bird'
13 14 15 16
require 'models/car'
require 'models/engine'
require 'models/tyre'

17

E
Emilio Tagua 已提交
18
class RelationTest < ActiveRecord::TestCase
19
  fixtures :authors, :topics, :entrants, :developers, :companies, :developers_projects, :accounts, :categories, :categorizations, :posts, :comments,
20 21 22 23
    :taggings, :cars

  def test_two_named_scopes_with_includes_should_not_drop_any_include
    car = Car.incl_engines.incl_tyres.first
24 25
    assert_no_queries { car.tyres.length }
    assert_no_queries { car.engines.length }
26
  end
27

N
Neeraj Singh 已提交
28 29 30 31 32 33 34
  def test_apply_relation_as_where_id
    posts = Post.arel_table
    post_authors = posts.where(posts[:author_id].eq(1)).project(posts[:id])
    assert_equal 5, post_authors.to_a.size
    assert_equal 5, Post.where(:id => post_authors).size
  end

35 36 37 38 39
  def test_multivalue_where
    posts = Post.where('author_id = ? AND id = ?', 1, 1)
    assert_equal 1, posts.to_a.size
  end

40 41 42 43 44 45
  def test_scoped
    topics = Topic.scoped
    assert_kind_of ActiveRecord::Relation, topics
    assert_equal 4, topics.size
  end

46 47 48 49 50 51 52 53 54 55
  def test_to_json
    assert_nothing_raised  { Bird.scoped.to_json }
    assert_nothing_raised  { Bird.scoped.all.to_json }
  end

  def test_to_yaml
    assert_nothing_raised  { Bird.scoped.to_yaml }
    assert_nothing_raised  { Bird.scoped.all.to_yaml }
  end

56 57 58 59 60
  def test_to_xml
    assert_nothing_raised  { Bird.scoped.to_xml }
    assert_nothing_raised  { Bird.scoped.all.to_xml }
  end

61 62 63 64 65 66
  def test_scoped_all
    topics = Topic.scoped.all
    assert_kind_of Array, topics
    assert_no_queries { assert_equal 4, topics.size }
  end

P
Pratik Naik 已提交
67 68 69 70 71 72 73 74 75 76 77
  def test_loaded_all
    topics = Topic.scoped

    assert_queries(1) do
      2.times { assert_equal 4, topics.all.size }
    end

    assert topics.loaded?
  end

  def test_scoped_first
P
Pratik Naik 已提交
78
    topics = Topic.scoped.order('id ASC')
P
Pratik Naik 已提交
79 80 81 82 83 84 85 86 87

    assert_queries(1) do
      2.times { assert_equal "The First Topic", topics.first.title }
    end

    assert ! topics.loaded?
  end

  def test_loaded_first
P
Pratik Naik 已提交
88
    topics = Topic.scoped.order('id ASC')
P
Pratik Naik 已提交
89 90 91 92 93 94 95 96 97

    assert_queries(1) do
      topics.all # force load
      2.times { assert_equal "The First Topic", topics.first.title }
    end

    assert topics.loaded?
  end

98 99 100 101 102 103 104 105 106
  def test_reload
    topics = Topic.scoped

    assert_queries(1) do
      2.times { topics.to_a }
    end

    assert topics.loaded?

107 108
    original_size = topics.to_a.size
    Topic.create! :title => 'fake'
109

110 111 112
    assert_queries(1) { topics.reload }
    assert_equal original_size + 1, topics.size
    assert topics.loaded?
113 114
  end

115
  def test_finding_with_conditions
116 117
    assert_equal ["David"], Author.where(:name => 'David').map(&:name)
    assert_equal ['Mary'],  Author.where(["name = ?", 'Mary']).map(&:name)
118
    assert_equal ['Mary'],  Author.where("name = ?", 'Mary').map(&:name)
119 120 121
  end

  def test_finding_with_order
122
    topics = Topic.order('id')
123
    assert_equal 4, topics.to_a.size
124 125 126
    assert_equal topics(:first).title, topics.first.title
  end

127 128 129 130 131 132
  def test_finding_with_order_concatenated
    topics = Topic.order('author_name').order('title')
    assert_equal 4, topics.to_a.size
    assert_equal topics(:fourth).title, topics.first.title
  end

133 134 135 136 137 138
  def test_finding_with_reorder
    topics = Topic.order('author_name').order('title').reorder('id')
    assert_equal 4, topics.to_a.size
    assert_equal topics(:first).title, topics.first.title
  end

139
  def test_finding_with_order_and_take
140
    entrants = Entrant.order("id ASC").limit(2).to_a
141

P
Pratik Naik 已提交
142 143
    assert_equal 2, entrants.size
    assert_equal entrants(:first).name, entrants.first.name
144 145 146
  end

  def test_finding_with_order_limit_and_offset
147
    entrants = Entrant.order("id ASC").limit(2).offset(1)
148

149
    assert_equal 2, entrants.to_a.size
P
Pratik Naik 已提交
150
    assert_equal entrants(:second).name, entrants.first.name
151

152
    entrants = Entrant.order("id ASC").limit(2).offset(2)
153
    assert_equal 1, entrants.to_a.size
P
Pratik Naik 已提交
154
    assert_equal entrants(:third).name, entrants.first.name
155 156 157
  end

  def test_finding_with_group
158
    developers = Developer.group("salary").select("salary").to_a
159 160 161 162
    assert_equal 4, developers.size
    assert_equal 4, developers.map(&:salary).uniq.size
  end

163 164
  def test_select_with_block
    even_ids = Developer.scoped.select {|d| d.id % 2 == 0 }.map(&:id)
165
    assert_equal [2, 4, 6, 8, 10], even_ids.sort
166 167
  end

168
  def test_finding_with_hash_conditions_on_joined_table
169
    firms = DependentFirm.joins(:account).where({:name => 'RailsCore', :accounts => { :credit_limit => 55..60 }}).to_a
170 171 172 173 174
    assert_equal 1, firms.size
    assert_equal companies(:rails_core), firms.first
  end

  def test_find_all_with_join
175
    developers_on_project_one = Developer.joins('LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id').
176
      where('project_id=1').to_a
177 178 179 180 181 182 183 184

    assert_equal 3, developers_on_project_one.length
    developer_names = developers_on_project_one.map { |d| d.name }
    assert developer_names.include?('David')
    assert developer_names.include?('Jamis')
  end

  def test_find_on_hash_conditions
185
    assert_equal Topic.find(:all, :conditions => {:approved => false}), Topic.where({ :approved => false }).to_a
186 187 188
  end

  def test_joins_with_string_array
189
    person_with_reader_and_post = Post.joins([
190 191 192 193 194 195
        "INNER JOIN categorizations ON categorizations.post_id = posts.id",
        "INNER JOIN categories ON categories.id = categorizations.category_id AND categories.type = 'SpecialCategory'"
      ]
    ).to_a
    assert_equal 1, person_with_reader_and_post.size
  end
196

197 198
  def test_scoped_responds_to_delegated_methods
    relation = Topic.scoped
199 200

    ["map", "uniq", "sort", "insert", "delete", "update"].each do |method|
201
      assert_respond_to relation, method, "Topic.scoped should respond to #{method.inspect}"
202 203 204
    end
  end

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
  def test_respond_to_delegates_to_relation
    relation = Topic.scoped
    fake_arel = Struct.new(:responds) {
      def respond_to? method, access = false
        responds << [method, access]
      end
    }.new []

    relation.extend(Module.new { attr_accessor :arel })
    relation.arel = fake_arel

    relation.respond_to?(:matching_attributes)
    assert_equal [:matching_attributes, false], fake_arel.responds.first

    fake_arel.responds = []
    relation.respond_to?(:matching_attributes, true)
    assert_equal [:matching_attributes, true], fake_arel.responds.first
  end

224 225 226 227
  def test_respond_to_dynamic_finders
    relation = Topic.scoped

    ["find_by_title", "find_by_title_and_author_name", "find_or_create_by_title", "find_or_initialize_by_title_and_author_name"].each do |method|
228
      assert_respond_to relation, method, "Topic.scoped should respond to #{method.inspect}"
229 230
    end
  end
231

232 233 234 235 236
  def test_respond_to_class_methods_and_named_scopes
    assert DeveloperOrderedBySalary.scoped.respond_to?(:all_ordered_by_name)
    assert Topic.scoped.respond_to?(:by_lifo)
  end

237
  def test_find_with_readonly_option
238 239
    Developer.scoped.each { |d| assert !d.readonly? }
    Developer.scoped.readonly.each { |d| assert d.readonly? }
240
  end
241 242

  def test_eager_association_loading_of_stis_with_multiple_references
243
    authors = Author.eager_load(:posts => { :special_comments => { :post => [ :special_comments, :very_special_comment ] } }).
244
      order('comments.body, very_special_comments_posts.body').where('posts.id = 4').to_a
245

246 247 248 249 250 251 252
    assert_equal [authors(:david)], authors
    assert_no_queries do
      authors.first.posts.first.special_comments.first.post.special_comments
      authors.first.posts.first.special_comments.first.post.very_special_comment
    end
  end

253
  def test_find_with_preloaded_associations
254
    assert_queries(2) do
255
      posts = Post.preload(:comments)
256
      assert posts.first.comments.first
257
    end
258

259
    assert_queries(2) do
260
      posts = Post.preload(:comments).to_a
261
      assert posts.first.comments.first
262
    end
263

264
    assert_queries(2) do
265
      posts = Post.preload(:author)
266
      assert posts.first.author
267
    end
268

269
    assert_queries(2) do
270
      posts = Post.preload(:author).to_a
271 272 273 274 275 276
      assert posts.first.author
    end

    assert_queries(3) do
      posts = Post.preload(:author, :comments).to_a
      assert posts.first.author
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
      assert posts.first.comments.first
    end
  end

  def test_find_with_included_associations
    assert_queries(2) do
      posts = Post.includes(:comments)
      assert posts.first.comments.first
    end

    assert_queries(2) do
      posts = Post.scoped.includes(:comments)
      assert posts.first.comments.first
    end

    assert_queries(2) do
      posts = Post.includes(:author)
      assert posts.first.author
    end

    assert_queries(3) do
      posts = Post.includes(:author, :comments).to_a
      assert posts.first.author
300
      assert posts.first.comments.first
301 302
    end
  end
303

P
Pratik Naik 已提交
304
  def test_default_scope_with_conditions_string
305
    assert_equal Developer.find_all_by_name('David').map(&:id).sort, DeveloperCalledDavid.scoped.map(&:id).sort
306
    assert_nil DeveloperCalledDavid.create!.name
307 308 309
  end

  def test_default_scope_with_conditions_hash
310
    assert_equal Developer.find_all_by_name('Jamis').map(&:id).sort, DeveloperCalledJamis.scoped.map(&:id).sort
311 312 313
    assert_equal 'Jamis', DeveloperCalledJamis.create!.name
  end

314 315 316 317 318
  def test_default_scoping_finder_methods
    developers = DeveloperCalledDavid.order('id').map(&:id).sort
    assert_equal Developer.find_all_by_name('David').map(&:id).sort, developers
  end

319 320
  def test_loading_with_one_association
    posts = Post.preload(:comments)
321 322 323 324
    post = posts.find { |p| p.id == 1 }
    assert_equal 2, post.comments.size
    assert post.comments.include?(comments(:greetings))

325
    post = Post.where("posts.title = 'Welcome to the weblog'").preload(:comments).first
326 327 328
    assert_equal 2, post.comments.size
    assert post.comments.include?(comments(:greetings))

329
    posts = Post.preload(:last_comment)
330 331 332 333 334
    post = posts.find { |p| p.id == 1 }
    assert_equal Post.find(1).last_comment, post.last_comment
  end

  def test_loading_with_one_association_with_non_preload
335
    posts = Post.eager_load(:last_comment).order('comments.id DESC')
336 337 338
    post = posts.find { |p| p.id == 1 }
    assert_equal Post.find(1).last_comment, post.last_comment
  end
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357

  def test_dynamic_find_by_attributes
    david = authors(:david)
    author = Author.preload(:taggings).find_by_id(david.id)
    expected_taggings = taggings(:welcome_general, :thinking_general)

    assert_no_queries do
      assert_equal expected_taggings, author.taggings.uniq.sort_by { |t| t.id }
    end

    authors = Author.scoped
    assert_equal david, authors.find_by_id_and_name(david.id, david.name)
    assert_equal david, authors.find_by_id_and_name!(david.id, david.name)
  end

  def test_dynamic_find_by_attributes_bang
    author = Author.scoped.find_by_id!(authors(:david).id)
    assert_equal "David", author.name

P
Pratik Naik 已提交
358
    assert_raises(ActiveRecord::RecordNotFound) { Author.scoped.find_by_id_and_name!(20, 'invalid') }
359 360 361 362 363 364 365 366 367
  end

  def test_dynamic_find_all_by_attributes
    authors = Author.scoped

    davids = authors.find_all_by_name('David')
    assert_kind_of Array, davids
    assert_equal [authors(:david)], davids
  end
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388

  def test_dynamic_find_or_initialize_by_attributes
    authors = Author.scoped

    lifo = authors.find_or_initialize_by_name('Lifo')
    assert_equal "Lifo", lifo.name
    assert lifo.new_record?

    assert_equal authors(:david), authors.find_or_initialize_by_name(:name => 'David')
  end

  def test_dynamic_find_or_create_by_attributes
    authors = Author.scoped

    lifo = authors.find_or_create_by_name('Lifo')
    assert_equal "Lifo", lifo.name
    assert ! lifo.new_record?

    assert_equal authors(:david), authors.find_or_create_by_name(:name => 'David')
  end

P
Pratik Naik 已提交
389 390 391 392 393 394
  def test_find_id
    authors = Author.scoped

    david = authors.find(authors(:david).id)
    assert_equal 'David', david.name

P
Pratik Naik 已提交
395
    assert_raises(ActiveRecord::RecordNotFound) { authors.where(:name => 'lifo').find('42') }
P
Pratik Naik 已提交
396
  end
397

P
Pratik Naik 已提交
398 399 400 401 402 403 404 405 406 407
  def test_find_ids
    authors = Author.order('id ASC')

    results = authors.find(authors(:david).id, authors(:mary).id)
    assert_kind_of Array, results
    assert_equal 2, results.size
    assert_equal 'David', results[0].name
    assert_equal 'Mary', results[1].name
    assert_equal results, authors.find([authors(:david).id, authors(:mary).id])

P
Pratik Naik 已提交
408 409
    assert_raises(ActiveRecord::RecordNotFound) { authors.where(:name => 'lifo').find(authors(:david).id, '42') }
    assert_raises(ActiveRecord::RecordNotFound) { authors.find(['42', 43]) }
P
Pratik Naik 已提交
410 411
  end

412 413
  def test_find_in_empty_array
    authors = Author.scoped.where(:id => [])
414
    assert_blank authors.all
415 416
  end

P
Pratik Naik 已提交
417 418 419 420 421
  def test_exists
    davids = Author.where(:name => 'David')
    assert davids.exists?
    assert davids.exists?(authors(:david).id)
    assert ! davids.exists?(authors(:mary).id)
P
Pratik Naik 已提交
422 423
    assert ! davids.exists?("42")
    assert ! davids.exists?(42)
P
Pratik Naik 已提交
424 425 426 427 428

    fake  = Author.where(:name => 'fake author')
    assert ! fake.exists?
    assert ! fake.exists?(authors(:david).id)
  end
429 430 431 432 433 434

  def test_last
    authors = Author.scoped
    assert_equal authors(:mary), authors.last
  end

P
Pratik Naik 已提交
435 436 437 438 439 440 441 442 443 444 445 446 447
  def test_destroy_all
    davids = Author.where(:name => 'David')

    # Force load
    assert_equal [authors(:david)], davids.to_a
    assert davids.loaded?

    assert_difference('Author.count', -1) { davids.destroy_all }

    assert_equal [], davids.to_a
    assert davids.loaded?
  end

P
Pratik Naik 已提交
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
  def test_delete_all
    davids = Author.where(:name => 'David')

    assert_difference('Author.count', -1) { davids.delete_all }
    assert ! davids.loaded?
  end

  def test_delete_all_loaded
    davids = Author.where(:name => 'David')

    # Force load
    assert_equal [authors(:david)], davids.to_a
    assert davids.loaded?

    assert_difference('Author.count', -1) { davids.delete_all }

    assert_equal [], davids.to_a
    assert davids.loaded?
  end

468 469 470 471
  def test_relation_merging
    devs = Developer.where("salary >= 80000") & Developer.limit(2) & Developer.order('id ASC').where("id < 3")
    assert_equal [developers(:david), developers(:jamis)], devs.to_a

P
Pratik Naik 已提交
472
    dev_with_count = Developer.limit(1) & Developer.order('id DESC') & Developer.select('developers.*')
473
    assert_equal [developers(:poor_jamis)], dev_with_count.to_a
474 475 476 477 478 479
  end

  def test_relation_merging_with_eager_load
    relations = []
    relations << (Post.order('comments.id DESC') & Post.eager_load(:last_comment) & Post.scoped)
    relations << (Post.eager_load(:last_comment) & Post.order('comments.id DESC') & Post.scoped)
480

481 482 483 484 485 486
    relations.each do |posts|
      post = posts.find { |p| p.id == 1 }
      assert_equal Post.find(1).last_comment, post.last_comment
    end
  end

487 488
  def test_relation_merging_with_locks
    devs = Developer.lock.where("salary >= 80000").order("id DESC") & Developer.limit(2)
489
    assert_present devs.locked
490 491
  end

492 493 494 495
  def test_relation_merging_with_preload
    [Post.scoped & Post.preload(:author), Post.preload(:author) & Post.scoped].each do |posts|
      assert_queries(2) { assert posts.first.author }
    end
496
  end
497

P
Pratik Naik 已提交
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
  def test_count
    posts = Post.scoped

    assert_equal 7, posts.count
    assert_equal 7, posts.count(:all)
    assert_equal 7, posts.count(:id)

    assert_equal 1, posts.where('comments_count > 1').count
    assert_equal 5, posts.where(:comments_count => 0).count
  end

  def test_count_with_distinct
    posts = Post.scoped

    assert_equal 3, posts.count(:comments_count, :distinct => true)
    assert_equal 7, posts.count(:comments_count, :distinct => false)

    assert_equal 3, posts.select(:comments_count).count(:distinct => true)
    assert_equal 7, posts.select(:comments_count).count(:distinct => false)
  end

  def test_count_explicit_columns
    Post.update_all(:comments_count => nil)
    posts = Post.scoped

P
Pratik Naik 已提交
523
    assert_equal [0], posts.select('comments_count').where('id is not null').group('id').order('id').count.values.uniq
524
    assert_equal 0, posts.where('id is not null').select('comments_count').count
525

P
Pratik Naik 已提交
526 527 528 529 530
    assert_equal 7, posts.select('comments_count').count('id')
    assert_equal 0, posts.select('comments_count').count
    assert_equal 0, posts.count(:comments_count)
    assert_equal 0, posts.count('comments_count')
  end
531

532 533 534 535 536 537
  def test_multiple_selects
    post = Post.scoped.select('comments_count').select('title').order("id ASC").first
    assert_equal "Welcome to the weblog", post.title
    assert_equal 2, post.comments_count
  end

538 539 540 541 542 543 544 545 546 547 548
  def test_size
    posts = Post.scoped

    assert_queries(1) { assert_equal 7, posts.size }
    assert ! posts.loaded?

    best_posts = posts.where(:comments_count => 0)
    best_posts.to_a # force load
    assert_no_queries { assert_equal 5, best_posts.size }
  end

549 550 551 552 553 554 555
  def test_count_complex_chained_relations
    posts = Post.select('comments_count').where('id is not null').group("author_id").where("comments_count > 0")

    expected = { 1 => 2 }
    assert_equal expected, posts.count
  end

P
Pratik Naik 已提交
556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
  def test_any
    posts = Post.scoped

    assert_queries(3) do
      assert posts.any? # Uses COUNT()
      assert ! posts.where(:id => nil).any?

      assert posts.any? {|p| p.id > 0 }
      assert ! posts.any? {|p| p.id <= 0 }
    end

    assert posts.loaded?
  end

  def test_many
    posts = Post.scoped
572

P
Pratik Naik 已提交
573 574 575 576 577
    assert_queries(2) do
      assert posts.many? # Uses COUNT()
      assert posts.many? {|p| p.id > 0 }
      assert ! posts.many? {|p| p.id < 2 }
    end
578

P
Pratik Naik 已提交
579 580 581
    assert posts.loaded?
  end

582 583 584 585 586 587
  def test_many_with_limits
    posts = Post.scoped

    assert posts.many?
    assert ! posts.limit(1).many?
  end
P
Pratik Naik 已提交
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603

  def test_build
    posts = Post.scoped

    post = posts.new
    assert_kind_of Post, post
  end

  def test_scoped_build
    posts = Post.where(:title => 'You told a lie')

    post = posts.new
    assert_kind_of Post, post
    assert_equal 'You told a lie', post.title
  end

604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
  def test_create
    birds = Bird.scoped

    sparrow = birds.create
    assert_kind_of Bird, sparrow
    assert sparrow.new_record?

    hen = birds.where(:name => 'hen').create
    assert ! hen.new_record?
    assert_equal 'hen', hen.name
  end

  def test_create_bang
    birds = Bird.scoped

    assert_raises(ActiveRecord::RecordInvalid) { birds.create! }

    hen = birds.where(:name => 'hen').create!
    assert_kind_of Bird, hen
    assert ! hen.new_record?
    assert_equal 'hen', hen.name
  end
P
Pratik Naik 已提交
626

627 628 629 630 631 632 633 634
  def test_explicit_create_scope
    hens = Bird.where(:name => 'hen')
    assert_equal 'hen', hens.new.name

    hens = hens.create_with(:name => 'cock')
    assert_equal 'cock', hens.new.name
  end

P
Pratik Naik 已提交
635 636 637 638 639 640 641 642 643 644 645
  def test_except
    relation = Post.where(:author_id => 1).order('id ASC').limit(1)
    assert_equal [posts(:welcome)], relation.all

    author_posts = relation.except(:order, :limit)
    assert_equal Post.where(:author_id => 1).all, author_posts.all

    all_posts = relation.except(:where, :order, :limit)
    assert_equal Post.all, all_posts.all
  end

P
Pratik Naik 已提交
646
  def test_anonymous_extension
647
    relation = Post.where(:author_id => 1).order('id ASC').extending do
P
Pratik Naik 已提交
648 649 650 651 652 653 654 655 656 657 658 659 660 661
      def author
        'lifo'
      end
    end

    assert_equal "lifo", relation.author
    assert_equal "lifo", relation.limit(1).author
  end

  def test_named_extension
    relation = Post.where(:author_id => 1).order('id ASC').extending(Post::NamedExtension)
    assert_equal "lifo", relation.author
    assert_equal "lifo", relation.limit(1).author
  end
662 663 664 665

  def test_order_by_relation_attribute
    assert_equal Post.order(Post.arel_table[:title]).all, Post.order("title").all
  end
666 667 668 669

  def test_relations_limit_with_conditions_or_limit
    assert_equal Post.limit(2).size, Post.limit(2).all.size
  end
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687

  def test_order_with_find_with_order
    assert_equal 'zyke', Car.order('name desc').find(:first, :order => 'id').name
  end

  def test_default_scope_order_with_named_scope_order
    assert_equal 'zyke', Car.order_using_new_style.limit(1).first.name
    assert_equal 'zyke', Car.order_using_old_style.limit(1).first.name
  end

  def test_order_using_scoping
    car = Car.order('id DESC').scoping do
      Car.find(:first, :order => 'id asc')
    end
    assert_equal 'zyke', car.name
  end


P
Pratik Naik 已提交
688
end