#181 Include vs Joins
Sep 28, 2009 | 11 minutes | Active Record
The :include and :joins options for the find method can be a little confusing because they are so similar. In this episode I show specifically when to use which option.
- Download:
- source codeProject Files in Zip (99.3 KB)
- mp4Full Size H.264 Video (19.8 MB)
- m4vSmaller H.264 Video (13.3 MB)
- webmFull Size VP8 Video (30.6 MB)
- ogvFull Size Theora Video (30.2 MB)
Resources
script/console
ActiveRecord::Base.logger = Logger.new(STDOUT) # to show logs
c = Comment.all(:joins => :user, :conditions => { :users => { :admin => true } })
c.first.users
c = Comment.all(:include => :user, :conditions => { :users => { :admin => true } })
c.first.users
User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id")
g = Group.first
Comment.all(:joins => {:user => :memberships}, :conditions => { :memberships => { :group_id => g.id } })
ActiveRecord::Base.logger = Logger.new(STDOUT) # to show logs c = Comment.all(:joins => :user, :conditions => { :users => { :admin => true } }) c.first.users c = Comment.all(:include => :user, :conditions => { :users => { :admin => true } }) c.first.users User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id") g = Group.first Comment.all(:joins => {:user => :memberships}, :conditions => { :memberships => { :group_id => g.id } })
models/comment.rb
class Comment < ActiveRecord::Base
belongs_to :user
end
class Comment < ActiveRecord::Base belongs_to :user end
models/user.rb
class User < ActiveRecord::Base
has_many :memberships
has_many :groups, :through => :memberships
has_many :comments
end
class User < ActiveRecord::Base has_many :memberships has_many :groups, :through => :memberships has_many :comments end
models/membership.rb
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :group
end
class Membership < ActiveRecord::Base belongs_to :user belongs_to :group end
models/group.rb
class Group < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
def comments
Comment.scoped(:joins => {:user => :memberships}, :conditions => { :memberships => { :group_id => id } })
end
end
class Group < ActiveRecord::Base has_many :memberships has_many :users, :through => :memberships def comments Comment.scoped(:joins => {:user => :memberships}, :conditions => { :memberships => { :group_id => id } }) end end
comments_controller.rb
def index
@comments = Comment.all(:joins => :user, :conditions => { :users => { :admin => true } }, :order => "comments.created_at desc")
end
def index @comments = Comment.all(:joins => :user, :conditions => { :users => { :admin => true } }, :order => "comments.created_at desc") end
users_controller.rb
def index
@users = User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id")
end
def index @users = User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id") end
views/groups/show.html.erb
<%= render @group.comments %>
<%= render @group.comments %>
views/users/index.html.erb
<%= pluralize user.comments_count, "comment" %>
<%= pluralize user.comments_count, "comment" %>
