Skip to content

Instantly share code, notes, and snippets.

@simong
Last active August 29, 2015 14:26
Show Gist options
  • Save simong/7c6cf085e4753ee3b096 to your computer and use it in GitHub Desktop.
Save simong/7c6cf085e4753ee3b096 to your computer and use it in GitHub Desktop.
Activity.belongsTo(Asset);
Asset.hasMany(Activity);
Asset.belongsToMany(User, {'as': 'users', 'through': 'asset_users'});
User.belongsToMany(Asset, {'as': 'assets', 'through': 'asset_users'});
// Query:
// Get all the assets that belong to user X AND check whether there is a like or dislike activity for the current user (can only be 1)
var queryOptions = {
'order': [['id', 'DESC']],
'limit': 10,
'offset': 0,
'include': [
{
'model': DB.Activity,
'attributes': ['type'],
'required': false,
'where': {
'user_id': currentUserId,
'type': ['like', 'dislike']
}
},
{
'model': DB.User,
'where': {
'id': someUserId
},
'required': true
'as': 'users'
}
]
};
// What I want
SELECT "asset"."id", "asset"."type", "asset"."url", "asset"."download_url", "asset"."title", "asset"."canvas_assignment_id", "asset"."description", "asset"."thumbnail_url", "asset"."embed_code", "asset"."mime", "asset"."source", "asset"."body", "asset"."likes", "asset"."dislikes", "asset"."views", "asset"."comment_count", "asset"."created_at", "asset"."updated_at", "asset"."deleted_at", "asset"."course_id"
FROM "assets" AS "asset"
LEFT OUTER JOIN "activities" AS "activities" ON "asset"."id" = "activities"."asset_id" AND "activities"."course_id" = 1 AND "activities"."user_id" = 1 AND "activities"."type" IN ('like', 'dislike') AND "activities"."object_type" = 'asset'
INNER JOIN ("asset_users" AS "users.asset_users" INNER JOIN "users" AS "users" ON "users"."id" = "users.asset_users"."user_id") ON "asset"."id" = "users.asset_users"."asset_id" AND "users"."id" = 4
WHERE ("asset"."deleted_at" IS NULL AND ("asset"."course_id" = 1))
ORDER BY "asset"."id" DESC
LIMIT 10
// What I get, notice the limit in the subquery
SELECT "asset".*, "activities"."id" AS "activities.id", "activities"."type" AS "activities.type", "users"."id" AS "users.id", "users"."canvas_user_id" AS "users.canvas_user_id", "users"."canvas_course_role" AS "users.canvas_course_role", "users"."canvas_enrollment_state" AS "users.canvas_enrollment_state", "users"."canvas_full_name" AS "users.canvas_full_name", "users"."canvas_image" AS "users.canvas_image", "users.asset_users"."created_at" AS "users.asset_users.created_at", "users.asset_users"."updated_at" AS "users.asset_users.updated_at", "users.asset_users"."user_id" AS "users.asset_users.user_id", "users.asset_users"."asset_id" AS "users.asset_users.asset_id" FROM
(SELECT "asset"."id", "asset"."type", "asset"."url", "asset"."download_url", "asset"."title", "asset"."canvas_assignment_id", "asset"."description", "asset"."thumbnail_url", "asset"."embed_code", "asset"."mime", "asset"."source", "asset"."body", "asset"."likes", "asset"."dislikes", "asset"."views", "asset"."comment_count", "asset"."created_at", "asset"."updated_at", "asset"."deleted_at", "asset"."course_id" FROM "assets" AS "asset" WHERE ("asset"."deleted_at" IS NULL AND ("asset"."course_id" = 1)) ORDER BY "asset"."id" DESC LIMIT 10) AS "asset"
LEFT OUTER JOIN "activities" AS "activities" ON "asset"."id" = "activities"."asset_id" AND "activities"."course_id" = 1 AND "activities"."user_id" = 1 AND "activities"."type" IN ('like', 'dislike') AND "activities"."object_type" = 'asset'
INNER JOIN ("asset_users" AS "users.asset_users" INNER JOIN "users" AS "users" ON "users"."id" = "users.asset_users"."user_id") ON "asset"."id" = "users.asset_users"."asset_id" AND "users"."id" = 4
ORDER BY "asset"."id" DESC;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment