2011-01-14 30 views
28

Tôi đã thiết lập mối quan hệ HABTM này trong quá khứ và hoạt động trước đó. kết thúc cố gắng tìm ra những gì sai. Tôi đã tìm kiếm thông qua các đường ray hướng dẫn tất cả các ngày và cant dường như để tìm ra những gì tôi đang làm sai, vì vậy giúp đỡ thực sự sẽ được đánh giá cao.Rails - Mối quan hệ HABTM - Làm thế nào tôi có thể tìm một bản ghi dựa trên một thuộc tính của mô hình liên kết

Tôi có 2 mô hình được kết nối thông qua mô hình tham gia và tôi đang cố tìm bản ghi dựa trên thuộc tính của mô hình được liên kết.

Event.rb

has_and_belongs_to_many :interests 

Interest.rb

has_and_belongs_to_many :events 

và một bảng tham gia di cư đã được tạo ra như

create_table 'events_interests', :id => false do |t| 
     t.column :event_id, :integer 
     t.column :interest_id, :integer 
    end 

tôi đã cố gắng

@events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ]) 

Nhưng đã xảy ra lỗi "Hiệp hội có tên 'quan tâm' không được tìm thấy; có lẽ bạn sai chính tả nó "... mà tôi didnt tất nhiên

tôi đã cố gắng

@events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ]) 

nhưng đã nhận lỗi" phương pháp xác định 'lợi ích cho #Class: 0x4383348"

Làm thế nào tôi có thể tìm ra sự kiện rằng có một id suất 4 .... tôi chắc chắn sẽ hói từ lol này

Trả lời

67

Bạn cần phải bao gồm bảng lợi ích.

@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4]) 

Bạn đã có nó ngay trong bài đăng của mình, nhưng bạn không đa nguyên hóa sở thích.

Cập nhật

Bởi vì câu trả lời này vẫn nhận được sự chú ý, tôi nghĩ rằng nó có thể là một ý tưởng tốt để cập nhật nó bằng cách sử ActiveRecord::Relation cú pháp từ cách trên sẽ được phản đối.

@events = Event.includes(:interests).where(interests: { id: 4 }) 

hoặc

@events = Event.includes(:interests).where('interests.id' => 4) 
5

Câu trả lời là hữu ích, cảm ơn! Tôi biết bài đăng này là cũ, nhưng tôi đã đưa ra một giải pháp khác có thể hữu ích cho ai đó. Tôi nhận thấy truy vấn tạo ra khá dài trong trường hợp của tôi. Đối với tôi, bảng tương đương với bảng "sở thích" của bạn có rất nhiều cột và dữ liệu trong đó. Để tránh việc tìm kiếm bảng cho id phù hợp, giải pháp của tôi trông tương tự như sau:

@events = Event.all.where('events.id' => @interest.events.each(&:id)) 

này làm việc cho tôi kể từ khi tôi đã có một đối tượng @interest instanced với danh sách các id cho các sự kiện. Tất nhiên bạn không sử dụng một số phép thuật mà đường ray có sẵn. Ngoài ra, tôi không thể có được giải pháp của bạn để làm việc với "không". Ví dụ;

@events = Event.includes(:interests).where.not(interests: { id: 4 }) 

sẽ không hoạt động. Nó sẽ trả về 0 kết quả.Nhưng điều này:

@events = Event.all.where.not('events.id' => @interest.events.each(&:id)) 

sẽ hoạt động, sẽ trả về tất cả các sự kiện không có liên quan đến @interest.

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