2012-10-01 39 views
16

Tôi có một danh mục có danh sách các mục. Các mục có vị trí và danh mục có mối quan hệ has_many: items,: order => "position". Khi người dùng cập nhật giá trị vị trí, tôi muốn xem vị trí của nó. Vị trí của tôi là một phao để cho phép di chuyển giữa các số được làm tròn.đường ray - cách làm mới liên kết sau khi lưu

pos=item.category.items.map(&:id) 
current_position=pos.index(id.to_i) 
item.save # want to refresh the relationship here 
pos_new=item.categoty.items.map(&:id) 
# grabbing this since just accessing item isn't updated if positioning has changed 
item_new=Item.find(id) 
pos_new=item_new.category.items.map(&:id) 
new_position=pos_new.index(id) 
if current_position!=new_position 
    is_moved=true # sent back in JSON to propagate a dynamic change. 
end 

Các công trình trên nhưng dường như thực sự tiết lộ. Có cách nào để tôi nói về mục tiết kiệm rằng mối quan hệ thể loại cần phải được làm mới kể từ khi thứ tự có thể được thay đổi?

Trả lời

25

Bạn có thể sử dụng item.reload để lấy lại mô hình từ cơ sở dữ liệu và lần sau bạn gọi một liên kết, nó sẽ tìm nạp lại nó.

4

Rails 4 sẽ cập nhật has_many của bạn/thuộc đối tượng liên kết cho bạn khi chúng thay đổi, nhưng nó sẽ không chạy lại truy vấn có nghĩa là mặc dù các mục trong category.items sẽ được cập nhật chúng sẽ không theo thứ tự . Tùy thuộc vào kích thước của bảng của bạn, bạn có thể muốn sử dụng ruby ​​để đặt hàng kết quả hoặc sử dụng category.reload để có được chúng theo thứ tự.

Xem RailsGuides tại http://guides.rubyonrails.org/association_basics.html và tìm kiếm inverse_of

32

Đối với các hiệp hội đơn hàng:

book.reload_author 

Đối với các hiệp hội khác:

author.books.reload 

http://guides.rubyonrails.org/association_basics.html#controlling-caching


Trong phiên bản cũ của đường ray, trước khi Rails 5, bạn có thể vượt qua true đến phương thức kết hợp làm thông số đầu tiên để làm cho nó tải lại: author.books(true).

+2

Ai vẫn đến câu trả lời này từ tìm kiếm (như tôi vừa làm): Hành vi này không còn được hỗ trợ bởi đường ray nữa. Bạn nhận được cảnh báo không dùng nữa. Cách mới cho các bộ sưu tập là sử dụng phương thức 'reload' trên proxy bộ sưu tập. – klaustopher

+0

@klaustopher Cảm ơn. Đã cập nhật câu trả lời của tôi. –

+1

"CẢNH BÁO KHÔNG TRẢ LỜI: Vượt qua một đối số để buộc liên kết tải lại hiện không còn được dùng nữa và sẽ bị xóa trong Rails 5.1. Vui lòng gọi' tải lại' trên đối tượng cha mẹ. (Gọi từ

tại (pry): 2) " – Dorian

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