Пользовательский запрос SQL без соответствующей таблицы
У меня есть SQL-запрос, который не зависит от таблицы, и я не знаю, как его обрабатывать с помощью Ruby On Rails.
Вот мой SQL-запрос (вам не нужно его понимать):
SELECT type, actor_id, events.created_at, photo_id, photos.user_id FROM
(SELECT 'comment' AS type, user_id AS actor_id, created_at, photo_id FROM comments
UNION
SELECT 'classification' AS type, user_id AS actor_id, created_at, photo_id FROM classifications)
AS events
INNER JOIN photos ON photo_id = photos.id
WHERE user_id = #{@user.id}
ORDER BY created_at DESC
LIMIT 9
Я попытался создать модель и использовать find_by_sql:
class RecentActivity ActiveRecord::Base
attr_accessor :type, :actor_id, :created_at, :photo_id, :user_id
end
Я получаю:
Mysql::Error: Table 'mysite_development.recent_activities' doesn't exist: SHOW FIELDS FROM `recent_activities`
Как я могу избежать этого сообщения? Есть ли альтернативное решение?
Ответы
Ответ 1
Вы можете захватить соединение db непосредственно из ActiveRecord:: Base, но это не так полезно, как расширение AR:: Base, поскольку защищенные полезные методы, такие как sanitize_sql, защищены.
class ComplexQueries < ActiveRecord::Base
def self.my_query
# Notice how you can, and should, still sanitize params here.
self.connection.execute(sanitize_sql(["select * from foo limit ?", 10]))
end
end
results = ComplexQueries.my_query
results.each_hash{|h| puts h.inspect}
Ответ 2
Вы также можете захватить соединение ActiveRecord и вызвать select_all:
ActiveRecord::Base.connection.select_all('select * from foo').each do |e|
puts e.inspect
end
Ответ 3
Если вы хотите создавать классы (модели), которые не поддерживают базу данных, вам не нужно указывать, что они наследуются от ActiveRecord.
Do
class RecentActivity
Вместо
class RecentActivity < ActiveRecord::Base
Тем не менее, может быть полезно получить дополнительную информацию о том, что вы пытаетесь сделать: например, если вы хотите иметь что-то вроде "комментариев" или "изображений" на нескольких разных вещах, таких как статья, или someones profile или blogpost в одном приложении, я бы рекомендовал проверить PolyMorphic Associations.