没有对应表的自定义SQL查询

col*_*rco 16 activerecord ruby-on-rails

我有一个不是特定于表的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
Run Code Online (Sandbox Code Playgroud)

我明白了:

Mysql::Error: Table 'mysite_development.recent_activities' doesn't exist: SHOW FIELDS FROM `recent_activities`

我该如何避免这条消息?有没有替代解决方案?

jdl*_*jdl 36

您可以直接从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}
Run Code Online (Sandbox Code Playgroud)

  • 有关执行结果的参考,请访问:http://rubydoc.info/gems/mysql/2.8.1/Mysql/Result (2认同)

ssc*_*eck 7

您还可以获取ActiveRecord连接并调用select_all:

ActiveRecord::Base.connection.select_all('select * from foo').each do |e|
  puts e.inspect
end
Run Code Online (Sandbox Code Playgroud)