Dường như Parse hoạt động bằng cách lưu trữ các đối tượng dưới dạng băm của cặp khóa-giá trị. Vì vậy, về cơ bản bạn có một id và sau đó một băm mà bạn có thể cho trí tưởng tượng của bạn chạy.
Để thực hiện các liên kết như ActiveRecord, bạn cần có khóa chính (ví dụ: Author.id) và khóa ngoài (ví dụ: Post.author_id). Author.id rất đơn giản - chỉ cần biến nó thành id của đối tượng Parse. Sau đó lưu trữ id tác giả cho một bài đăng bên trong bài đăng, được khóa bởi 'author_id'. Vì vậy, đó là phía dữ liệu.
Trong mã, có một số cấp thực hiện cần xem xét. Để truy xuất, bạn đang hướng tới thực hiện các phương pháp như sau:
class Author
def posts
@posts ||= Post.find(:all, :id => id)
end
end
class Post
def author
@author ||= Author.find(author_id)
end
end
Điều đó không quá khó và có thể được thực hiện bằng nhiều cách, ví dụ bằng cách sử dụng lập trình meta. Harder là tiết kiệm. Những gì bạn đang hướng tới, ít nhất là từ các Tác giả bên, là một cái gì đó như thế này:
class Author
def after_save
super
posts.each do |p|
p.author_id = id
p.save
end
end
end
Hay đúng hơn là tôi nên nói đó là những gì bạn có thể được nhắm đến tùy thuộc vào kịch bản. Một trong những cạm bẫy trong việc thực hiện các hiệp hội là quyết định khi nào cần làm. Bạn không muốn làm phức tạp cuộc sống của bạn, nhưng bạn cũng không muốn phát điên với các cuộc gọi API. Xem xét việc chỉ cập nhật tên của một tác giả:
a = Author.find(1)
a.name = "Joe"
a.save
Theo văn bản after_save
sẽ được tải bài viết hiện có (nó đi qua posts
mà đặt @posts), thiết lập AUTHOR_ID trên mỗi bài (mà không cần phải được thực hiện trong trường hợp này), và sau đó lưu các bài đăng mặc dù không có gì thay đổi chúng. Hơn nữa nếu một bài viết thất bại trong quá trình lưu? Trong trường hợp đó các giao dịch là cần thiết để bạn có thể khôi phục toàn bộ điều và ngăn chặn một trạng thái không nhất quán.
Bạn có thể thấy trong ActiveRecord code có một tấn logic xung quanh vấn đề cách xử lý trẻ em khi cha mẹ được lưu. Kết quả là các hiệp hội trơn tru và minh bạch nhưng tất cả những thứ khác có liên quan; proxies, association classes, v.v.
Lời khuyên của tôi là như vậy. Quyết định xem bạn có thực sự cần các hiệp hội trơn tru và minh bạch hay không. Nếu không, sau đó metaprogram một vài accessors và phương pháp thuận tiện và để nó ở đó. Nếu không, hãy dành thời gian nghiên cứu mã hiệp hội ActiveRecord trực tiếp hoặc xem xét DataMapper, AFAIK, cung cấp cho bạn giao diện giống như ActiveRecord, bao gồm các liên kết, với khả năng thay đổi lưu trữ dữ liệu.
Bạn đã nghe nói về [nulldb] (https://github.com/nulldb/nulldb) chưa? –