2010-10-06 25 views
11

Tôi có một mô hình Author có nguồn cấp dữ liệu. Sử dụng Rails 3 muốn thiết lập phạm vi tìm tất cả các tác giả không có nguồn cấp dữ liệu liên quan.Làm thế nào để sử dụng phạm vi Rails 3 để lọc trên bảng tham gia habtm nơi các bản ghi liên quan không tồn tại?

class Author < ActiveRecord::Base 

    has_and_belongs_to_many :feeds 
    scope :without_feed, joins(:feeds).where("authors_feeds.feed_id is null") 

end 

... dường như không hoạt động. Nó cảm thấy như một điều đơn giản. Tôi đang thiếu gì ở đây?

+0

Có vẻ như các kết nối (: nguồn cấp dữ liệu) đang thực hiện một phép nối bên trong mà sẽ chỉ chọn một tác giả nếu chúng có nguồn cấp dữ liệu ở vị trí đầu tiên? – Midwire

+0

Nó thực sự đang làm một tham gia bên trong: 'SELECT tác giả. * TỪ tác giả INNER JOIN authors_feeds ON authors_feeds.author_id = authors.id INNER JOIN nguồn cấp dữ liệu ON feeds.id = authors_feeds.feed_id WHERE (authors_feeds.feed_id is null)' và những gì tôi muốn là một tham gia bên ngoài. Bất kỳ giúp đỡ? – Midwire

Trả lời

21

Kiến thức của tôi ActiveRecord/Arel không có phương tiện xác định các kết nối bên ngoài. Vì vậy, bạn sẽ phải viết một chút SQL hơn bình thường. Một cái gì đó như thế này nên làm các trick:

scope :without_feed, joins('left outer join authors_feeds on authors.id=authors_feeds.author_id').where('authors_feeds.feed_id is null') 

Tôi tất nhiên đoán tại tên bảng của bạn và khóa ngoài. Nhưng điều đó sẽ cho bạn bức tranh.

+0

Đúng, điều đó đã xảy ra. Cảm ơn bạn! – Midwire

+1

Để làm nghịch đảo của điều này (chỉ trả lại Tác giả có X) nhưng với một Tác giả đơn giản has_many Địa chỉ, điều điên rồ này (ghép nối với nhau từ bài đăng này và [bình luận blog này] (http://www.bennadel.com/ blog/1093-Bắt-Một-Record-Per-Group-Từ-A-One-to-Nhiều-Join.htm # ý kiến)) dường như làm việc: 'phạm vi: with_address, tham gia (" bên ngoài bên ngoài tham gia (chọn author_id từ địa chỉ nhóm theo author_id) là địa chỉ trên địa chỉ.author_id = authors.id "). where (" addresses.author_id is not null ")' – chadoh

+0

@bioneuralnet, cảm ơn rất nhiều –

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