2013-07-28 31 views
10

Tôi đang làm việc trên một ứng dụng Rails 4 và trong phương pháp đăng bài của tôi cho một api tôi muốn tìm hồ sơ dựa trên những gì người dùng đang cố gắng tạo và nếu nó không tồn tại tạo ra nó nếu nó cập nhật các tham số mà nó có. Tôi đã viết một số mã thực sự làm điều này nhưng phải mất một chút để thực thi. Có cách nào khác để làm điều tương tự chính xác với mã hoặc truy vấn có thể ít hơn không.Rails ActiveRecord Tạo hoặc Tìm

@picture = current_picture.posts.where(post_id: params[:id]).first_or_initialize 
@picture.update_attributes(active: true, badge: parameters[:badge], identifier: parameters[:identifier]) 
render json: @picture 

Trả lời

22

Các Rails 4.0 release notes biểu thị rằng find_by_chưa được chấp nhận:

Tất cả các phương pháp năng động trừ cho find_by _... và find_by _...! bị không được chấp nhận.

Bên cạnh đó, theo Rails 4.0 documentation, các find_or_create_by phương pháp vẫn sẵn, nhưng đã được viết lại để phù hợp với cú pháp sau:

@picture = current_picture.posts.find_or_create_by(post_id: params[:id]) 

UPDATE:

Theo số source code:

# rails/activerecord/lib/active_record/relation.rb 
def find_or_create_by(attributes, &block) 
    find_by(attributes) || create(attributes, &block) 
end 

Do đó, nó đứng vào lý do mà nhiều thuộc tính có thể được thông qua như là đối số cho find_or_create_by trong Rails 4.

+0

Cảm ơn bạn nhưng tôi nghĩ rằng phương pháp đó đã được khấu hao trong Rails 4, tôi đoán là không. Vì vậy, tôi cũng đang sử dụng 'current_picture.posts.where (active: true, post_id: params [: id]). Take!' ở đâu khác, nên viết khác đi? – ny95

+0

Tôi đã cập nhật câu trả lời của mình. Theo tài liệu, bạn có thể tìm thấy bài viết đầu tiên của người dùng với 'post_id' bằng' params [: id] ', hoặc nếu không tạo bài viết của người dùng mới với thuộc tính' active' được đặt thành 'true':' current_picture.posts. create_with (active: true) .find_or_create_by (post_id: params [: post_id]) '. – zeantsoi

+0

Cảm ơn nếu bài đăng tồn tại, nó sẽ đặt bài đăng hiện tại thành đúng không? – ny95

0

Bạn có thể làm điều đó như sau,

@picture = current_picture.posts.where (post_id: params [: id]). find_or_create.

Điều này sẽ tìm bài đăng với thông số [: id] và nếu nó không tìm thấy bản ghi đó thì nó sẽ tạo bản ghi hình dưới ảnh hiện tại với id này.

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