2012-12-19 28 views
12

Vì vậy, về cơ bản tôi muốn biết nếu có một số cách tiếp cận phổ biến để xác định các loại liên kết riêng. Một số chi tiết:đường ray tùy chỉnh has_many liên kết (thông qua mảng pg)

Tôi có mô hình conversations có cột mảng PG user_ids. Vì vậy, để lấy cuộc hội thoại người sử dụng tôi cần phải chạy: select conversations.* from conversations where USER_ID = ANY(conversations.user_ids)

Kể từ finder_sql và bạn bè của nó đang bị phản đối bây giờ, tôi thực sự muốn biết điều gì sẽ là cách tốt nhất để thực hiện hiệp hội has_many giả này?

hiện tôi chỉ sử dụng các phương pháp như:

def conversations 
    Conversation.where("#{id} = ANY (conversations.users)") 
end 

Vì vậy, về cơ bản tôi đang nghĩ đến việc thực hiện của riêng tôi ActiveRecord::Associations::CollectionAssociation và muốn biết nếu đang có một số tài liệu tham khảo tốt hoặc nếu bạn có thể tư vấn bắt đầu từ đâu tại


+0

Bạn có bất kỳ kiểm soát nào đối với giản đồ không? Tôi hỏi vì sử dụng một mảng để giữ chìa khóa nước ngoài là thực hành xấu, và không chỉ vì những rắc rối nó gây ra bạn bây giờ. Thời gian _only_ bạn nên xem xét sử dụng một mảng là khi nó luôn luôn có thể được xử lý bởi cơ sở dữ liệu như là một điều không thể tách rời mà không có ý nghĩa với nó. –

+3

đúng, tôi quyết định đi với phương pháp này chỉ vì mục đích giáo dục. Bên cạnh đó, tôi đã hoàn toàn ngạc nhiên với hiệu suất mảng. Một điều khác đã thuyết phục tôi là điều này: http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/, khiến tôi nghĩ rằng đó không phải là một ý tưởng tồi sau tất cả –

+0

kể từ bạn quyết định đi với ARRAY có lẽ bạn cũng có thể đi với SQL Views? https://github.com/thoughtbot/scenic Và về cơ bản tạo ra một bảng khác mà không chuẩn hóa mảng của bạn thành một cái gì đó như: (Conversation_id, user_id) (nhiều-nhiều) để bạn có thể sử dụng bình thường có nhiều quan hệ. –

Trả lời

0

Làm thế nào về:

Conversation.user.select{ |conversation| conversation.user_ids.include?(params[:id]) 

Côn sidering cột user_ids đó được tuần tự hóa và id người dùng hiện tại được chuyển bởi các tham số [: id]

Cách tiếp cận chính là, nếu bạn có một mảng, bạn có thể kiểm tra xem nó có 'cái gì đó' bên trong không.) phương pháp. Suy nghĩ theo cách này, bạn có thể sử dụng phương thức chọn để thực sự chọn các đối tượng (người dùng, trong trường hợp này) có các ID của nó bên trong mảng này với phương thức include. Tôi có rõ ràng không?

Nói cho tôi biết nếu nó làm việc ...

0

Tôi nghĩ bạn có thể về cơ bản chỉ cần đặt mã phương pháp trong một mối quan hệ:

has_many :conversations, ->(user) { where("#{user.id} = ANY (conversations.users)") } 

Nó cuối cùng nên là cùng một trong hai cách, mặc dù. Phương thức của bạn trả về một mối quan hệ mà bạn có thể chuỗi. Một giải pháp thay thế khác có thể là một cái gì đó như:

has_many :conversations, -> { where('users.id IN conversations.users') } 

Có thể yêu cầu một số vấn đề. Có lý do nào bạn không thể thêm một bảng kết nối mới không? Lý tưởng sẽ là di chuyển nó sang bảng conversations_users. Sau đó, bạn có thể tham gia bàn một cách sạch sẽ và tận dụng lợi thế của các ràng buộc khóa ngoại.

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