获取关系中成员的所有关系
Get all relations to members in a relation
假设我有三个模型(模型改变了,我通常不会使用 has_many :through 这种关系):
class User << ActiveRecord::Base
has_many :image_users
has_many :images, through: :image_users
end
class ImageUser << ActiveRecord::Base
belongs_to :user
belongs_to :image
end
class Image << ActiveRecord::Base
has_many :image_users
has_many :users, through: :image_users
has_many :comments, through: :image_comments
end
class ImageComment << ActiveRecord::Base
belongs_to :image
belongs_to :comment
end
class Comment << ActiveRecord::Base
has_many :image_comments
has_many :images, through: :image_comments
end
给定一个用户,我如何select对其图片发表所有评论?理想情况下,我会使用 ActiveRecord 或 SQL 来避免将大量对象加载到内存中。希望之前没有人问过这个问题,google 很难做到。
User
has_many :images
has_many :comments
Image
belongs_to :user
has_many :comments
Comment
belongs_to :user
belongs_to :image
它会是这样的
@user.images.each {|e| e.comments}
如果你从@railsr 的回答中获取关系,你可以这样做:
Comment.where(image_id: @user.images.pluck(:id))
当然,这需要两个查询,但您可以使用一些原始 SQL 并将其合并为一个。
您应该能够做到这一点,让 Rails 处理 SQL:
@user.images.includes(:comments).map(&:comments)
假设我有三个模型(模型改变了,我通常不会使用 has_many :through 这种关系):
class User << ActiveRecord::Base
has_many :image_users
has_many :images, through: :image_users
end
class ImageUser << ActiveRecord::Base
belongs_to :user
belongs_to :image
end
class Image << ActiveRecord::Base
has_many :image_users
has_many :users, through: :image_users
has_many :comments, through: :image_comments
end
class ImageComment << ActiveRecord::Base
belongs_to :image
belongs_to :comment
end
class Comment << ActiveRecord::Base
has_many :image_comments
has_many :images, through: :image_comments
end
给定一个用户,我如何select对其图片发表所有评论?理想情况下,我会使用 ActiveRecord 或 SQL 来避免将大量对象加载到内存中。希望之前没有人问过这个问题,google 很难做到。
User
has_many :images
has_many :comments
Image
belongs_to :user
has_many :comments
Comment
belongs_to :user
belongs_to :image
它会是这样的
@user.images.each {|e| e.comments}
如果你从@railsr 的回答中获取关系,你可以这样做:
Comment.where(image_id: @user.images.pluck(:id))
当然,这需要两个查询,但您可以使用一些原始 SQL 并将其合并为一个。
您应该能够做到这一点,让 Rails 处理 SQL:
@user.images.includes(:comments).map(&:comments)