Giả sử chúng tôi có một trang web nhiếp ảnh. Bất kỳ tác giả nào cũng có thể đăng ký để nhận thông tin cập nhật từ bất kỳ tác giả nào khác. Rõ ràng là nếu tác giả A được đăng ký tác giả B mà không có nghĩa là B được đăng ký với A. Vì vậy, chúng ta xây dựng mô hìnhLàm cách nào để tạo các mối quan hệ nhiều-nhiều-nhiều trong Rails?
class Author < ActiveRecord::Base
has_many :subscriptions
has_many :subscribed_by_author, :through => :subscriptions, :source => :subscribed_to
end
class Subscription < ActiveRecord::Base
belongs_to :author
belongs_to :subscribed_to, :class_name => "Author", :foreign_key => "subscribed_to"
end
Bằng cách này chúng ta có thể sử dụng
- some_author.subscribed_by_author - danh sách của các tác giả mà ai đó đã đăng ký.
- Đối với bất kỳ thuê bao chúng ta có thể biết cả hai đầu (ai đăng ký với ai)
Nhưng câu hỏi là làm thế nào để có được danh sách những người đăng ký một số tác giả chỉ sử dụng đường ray (không sử dụng SQL đồng bằng) tức là get câu trả lời cho: "Ai được đăng ký với some_author?"
Câu hỏi: có khả năng nào trong Rails để có được mối quan hệ làm việc cả hai bên tức là không chỉ viết some_author.subscribed_BY_author
mà còn có some_author_subscribed_TO_author
? Nếu có, thì nó là gì?
P.S. giải pháp rõ ràng là
- Thay đổi thiết kế cơ sở dữ liệu, thêm một cột có tên là "hướng"
- Tạo 2 ghi lại mỗi lần một thuê bao được tạo ra
Thêm vào mô hình giả
has_many: subscribed_BY_author ,: through =>: subscription,: source =>: subscribed_to,: conditions => "direction = 'by'"
has_many: subscribed_TO_author,: through =>: subscriptions,: source =>: subscribed_to,: condit ions => "direction = 'to'"
Nhưng tôi tự hỏi nếu có giải pháp mà không thay đổi thiết kế cơ sở dữ liệu.
Thật không may là không.Nhưng nó đã cho tôi hướng đi đúng và mã sau đây đã làm việc # Mô hình riêng lẻ has_many: subscriptions_to,: class_name => "Subscription",: foreign_key => "subscribed_to" has_many: subscribed_to_author,: through =>: subscriptions_to,: source =>: tác giả Vì vậy, tôi chấp nhận câu trả lời này, nhưng bạn phải chỉnh sửa câu trả lời chính xác trước :) Cảm ơn! –
Nó luôn luôn là niềm vui lớn của tôi để sửa chữa aswers của tôi :) – klew