Để thêm vào câu trả lời của Josh, đôi khi bạn có thể muốn chia sẻ một số mã xác định một liên kết đa hình. Bạn không thể chỉ cần đặt cuộc gọi has_many
phương pháp trong mô-đun của bạn, bởi vì bạn sẽ gặp phải lỗi, ví dụ như trong một module gọi là Votable:
undefined method `has_many' for Voteable:Module (NoMethodError)
Vì vậy, thay vào đó, bạn cần phải sử dụng các phương pháp self.included(base)
và base.instance_eval
. Dưới đây là một ví dụ với mô-đun Voteable
tôi:
module Voteable
def self.included(base)
base.instance_eval do
has_many :votes, as: :voteable
has_many :voters, through: :votes
end
end
def voted_up_by?(user)
user and votes.exists?(value: 1, voter_id: user)
end
def voted_down_by?(user)
user and votes.exists?(value: -1, voter_id: user)
end
end
Bây giờ bạn có thể include Voteable
trong các mô hình mà sẽ có hành vi đó. Điều này sẽ thực thi phương thức self.included(base)
và nó sẽ định nghĩa liên kết trên lớp bao gồm.
cảm ơn bạn! đó là những gì tôi đã kết thúc bằng cách sử dụng –
dude. Đó là tất cả về thư mục lib. Tôi đã bắt đầu đặt thêm mã ở đó và nó chỉ là nơi thuận tiện để tổ chức mọi thứ. –