2011-10-09 26 views
11

Gần đây tôi đã viết ParseResource, là một trình bao bọc API Ruby cho Parse.com's REST api.Thực hiện các liên kết giống như ActiveRecord cho trình bao bọc API

Dưới đây là một số cách sử dụng cơ bản:

class Post < ParseResource 
    fields :title, :author, :body 
end 
p = Post.create(:title => "Hello world", :author => "Alan", :body => "ipso lorem") 

Dự án này là khá trẻ, và một tính năng thực sự tôi muốn thực hiện là hiệp hội. Một cái gì đó như thế này:

class Author < ParseResource 
    has_many :posts 
    fields :name, :email 
end 
class Post < ParseResource 
    belongs_to :author 
    fields :title, :body 
end 
a = Author.create(:name => "Alan", :email => "[email protected]") 
p = Post.create(:title => "Associated!", :body => "ipso lorem", :author => a) 
p.author.class #=> Author 
p.author.name #=> "Alan" 
a.posts #=> an array of Post objects 

Tôi thích bất kỳ lời khuyên, con trỏ và cạm bẫy nào của bất kỳ ai đã thực hiện điều gì đó tương tự cũng như từ bất kỳ ai nắm bắt API REST của Parse.

+0

Bạn đã nghe nói về [nulldb] (https://github.com/nulldb/nulldb) chưa? –

Trả lời

0

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.

3

Tôi đã tìm thấy bằng cách sử dụng DataMapper (http://datamapper.org) nó khá dễ dàng để làm cho nó làm việc với hầu như bất kỳ kho dữ liệu nào. Bạn có thể viết một adapter để nói chuyện với kho dữ liệu của bạn và sau đó sử dụng tất cả sức mạnh của DataMapper trực tiếp như thể dữ liệu của bạn nằm trong SQL.Đây là một liên kết giải thích một chút về cách viết một trong các bộ điều hợp này. http://www.killswitchcollective.com/articles/55_datamapperabstractadapter_101

Các vấn đề liên quan