Подтвердить что ты не робот

Пользовательский запрос 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`

Как я могу избежать этого сообщения? Есть ли альтернативное решение?

4b9b3361

Ответ 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.