I try create table with intermediate results specialy for report.
What I’m doing is:
ActiveRecord::Base.connection.execute(sql_query)
sql_query is:
SET SQL_SAFE_UPDATES=0;
DROP TABLE IF EXISTS _by_people_daily;
CREATE TEMPORARY TABLE _by_people_daily
AS
SELECT #{date_int} AS date_int,
memberships.user_id AS user_id,
ci.community_id,
ci.content_id,
contents.composite_type AS content_type,
COUNT(views.id) AS views,
COUNT(comments.id) AS comments,
COUNT(shares.id) AS shares,
COUNT(likes.id) AS likes,
COUNT(uploads.id) AS uploads
FROM community_items AS ci
JOIN memberships ON memberships.community_id = ci.community_id
JOIN contents ON ci.content_id = contents.id
JOIN (SELECT '#{day_begin}' as start_date, '#{day_end}' as end_date) AS dates
LEFT JOIN contents AS uploads
ON uploads.id = ci.content_id
AND uploads.user_id = memberships.user_id
AND uploads.created_at BETWEEN dates.start_date AND dates.end_date
LEFT JOIN comments
ON comments.content_id = ci.content_id
AND comments.user_id = memberships.user_id
AND comments.created_at BETWEEN dates.start_date AND dates.end_date
LEFT JOIN shares
ON shares.content_id = ci.content_id
AND shares.user_id = memberships.user_id
AND shares.created_at BETWEEN dates.start_date AND dates.end_date
LEFT JOIN likes
ON likes.content_id = ci.content_id
AND likes.user_id = memberships.user_id
AND likes.created_at BETWEEN dates.start_date AND dates.end_date
LEFT JOIN views
ON views.viewable_id = ci.content_id
AND views.viewable_type = 'Content'
AND views.user_id = memberships.user_id
AND views.created_at BETWEEN dates.start_date AND dates.end_date
WHERE COALESCE(views.id, comments.id, shares.id, likes.id, uploads.id ) IS NOT NULL
#{ " AND users.company_id = #{@company.id} " if @company }
GROUP BY memberships.user_id, ci.community_id, ci.content_id, contents.composite_type ;
DELETE FROM intermediate_by_people WHERE date_int = #{date_int} ;
INSERT INTO intermediate_by_people
(date_int, user_id, community_id, content_id, content_type, views, comments, shares, uploads, likes)
SELECT date_int, user_id, community_id, content_id, content_type, views, comments, shares, uploads, likes
FROM _by_people_daily ;
I’m getting error every time
ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP TABLE IF EXISTS _by_people_daily;
But when I pass query to mysql client it working correctly.
What I’m doing wrong and how execute couple sql statements with ActiveRecord
ActiveRecord’s MySQL connection can only execute one statement by default. To execute multiple statements,
CLIENT_MULTI_STATEMENTS(65536) need to be passed as an option when creating the connection. The code may look like this:You can find
ConnectionAdapters::MysqlAdapter.newin your mysql gem, and override that method inconfig/initializers.