Rails ActiveRecord - Best way to perform an include?

Posted by dwhite on Stack Overflow See other posts from Stack Overflow or by dwhite
Published on 2010-03-06T20:57:02Z Indexed on 2010/03/08 1:49 UTC
Read the original article Hit count: 820

Filed under:
|

I have three models:

class Book < ActiveRecord::Base
  has_many :collections
  has_many :users, :through => :collections
end

class User < ActiveRecord::Base
  has_many :collections
  has_many :books, :through => :collections
end

class Collection < ActiveRecord::Base
  belongs_to :book
  belongs_to :user
end

I'm trying to display a list of the books and have a link to either add or remove from the user's collection. I can't quite figure out the best syntax to do this.

For example, if I do the following:

Controller

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end

View

...
<% if book.users.include?(current_user) %>
...

or obviously the inverse...

...
<% if current_user.books.include?(book) %>
...

Then queries are sent for each book to check on that include? which is wasteful. I was thinking of adding the users or collections to the :include on the Book.all, but I'm not sure this is the best way. Effectively all I need is the book object and just a boolean column of whether or not the current user has the book in their collection, but I'm not sure how to forumlate the query in order to do that.

Thanks in advance for your help.

-Damien

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about activerecord