Note về scope với Rails 4.2.0

Ngữ cảnh

App của mình có 2 models có quan hệ như sau:

# app/models/user.rb
class User < ActiveRecord::Base
  has_many :posts
end

# app/models/post.rb
class Post < ActiveRecord::Base
  scope :first_by_user, ->(uid) { find_by(user_id: uid) }
  belongs_to :user
end

Vấn đề gặp phải

Khi mình sử dụng scope first_by_user ở trên, và sử dụng trực tiếp api find_by của model, trong trường hợp KHÔNG CÓ RECORD THOẢ MÃN ĐIỀU KIỆN QUERY thì có sự khác biệt như sau:

・Với api find_by:

[2.2.2 :010 > Post.find_by(user_id: 2)
  Post Load (0.3ms)  SELECT  `posts`.* FROM `posts` WHERE `posts`.`user_id` = 2 LIMIT 1
 => nil 

・ Với scope first_by_user:

[2.2.2 :008 > Post.first_by_user(2)
  Post Load (3.8ms)  SELECT  `posts`.* FROM `posts` WHERE `posts`.`user_id` = 2 LIMIT 1
  Post Load (0.9ms)  SELECT  `posts`.* FROM `posts`
=> #<ActiveRecord::Relation [All data of posts table]

Như vậy là sử dụng scope đã gây ra THỪA 1 CÂU QUERY và làm SAI KẾT QUẢ TRẢ VỀ

Cách khắc phục

Hiện tại thì ngoài cách dùng api find_by 1 cách trực tiếp ra mình chưa có cách nào tránh được lỗi này cả. Mình ưa dùng scope vì sẽ làm code tường mình hơn.
Cũng có cách là define class method như sau:

#app/models/post.rb
def self.first_by_user(uid)
  find_by(user_id: uid)
end

nhưng mình thấy ko hay, vì như thế sẽ làm chặn khả năng chainable của sope.
Mình cũng đã thử googled rồi nhưng vẫn chưa tìm thấy giải thích là tại sao lại như vậy :(

----- UPDATE ----
Kết quả cũng tai hại tương tự nếu như viết scope trên thành:

  scope :first_by_user, ->(uid) { where(user_id: uid).first } 
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ManhDV

21 bài viết.
37 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
42 7
TL; DR Cấu hình mastermaster trên nhiều node EC2 Mỗi node có nhiều database, với schema giống hệt nhau. Thực hiện điều phối việc read/write b...
ManhDV viết hơn 1 năm trước
42 7
White
14 0
Background Với những database có lượng read lớn thì tầm quan trọng của việc warmup BP đã được nhắc tới nhiều. Nhưng nó có hiệu quả tới mức như thế...
ManhDV viết hơn 1 năm trước
14 0
White
14 3
Background Bạn có nhớ gì về hồi cấp 3 ko? Ý mình ko phải là hình ảnh em gái xinh nhất khối mặc áo trong và ngoài có mã màu lần lượt là 000 và fff ...
ManhDV viết hơn 1 năm trước
14 3
Bài viết liên quan
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 5 tháng trước
0 2
White
20 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết 2 năm trước
20 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
21 bài viết.
37 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!