Rails Active Record, как иметь дополнительный параметр поля в результате запроса?

У меня на самом деле есть эта модель:

class Role < ActiveRecord::Base
  acts_as_authorization_role

  def self.all_join_wisp
    self.connection.select_all("SELECT roles.*, wisps.name AS wisp_name FROM roles LEFT JOIN wisps ON wisps.id = roles.authorizable_id")
  end
end

метод all_join_wisp делает почти то, что я хочу, он добавляет поле wisp_name, за исключением того, что возвращает хеш, а не объект активной записи.

Есть ли способ получить объект активной записи вместо этого?

Ролевая модель не имеет принадлежащего_, а модель wisp не имеет has_many: роли, я думаю, это было сделано для большей гибкости (я не разрабатывал приложение, над которым работаю).

Изменить: Решение реализовано

Решение реализовано здесь: https://github.com/nemesisdesign/OpenWISP-Geographic-Monitoring/blob/287861d95fffde35d78b76ca1e529c21b0f3a54b/app/models/role.rb#L25 Благодаря @house9

2 ответа

Решение

Ты можешь использовать find_by_sql - вы получаете то, что выглядит как объект activerecord, но на самом деле это не так, у него будут атрибуты из вашего запроса, но все они будут строковыми типами данных вместо реальных типов, часто это нормально

def self.all_join_wisp
  self.find_by_sql("SELECT roles.*, wisps.name AS wisp_name FROM roles LEFT JOIN wisps ON wisps.id = roles.authorizable_id")
end

затем

list = Role.all_join_wisp
list.each do |x|
  puts x
  puts x.inspect
  puts x.id # the role id 
  puts x.id.is_a?(Integer) # false
  puts x.id.is_a?(String) # true
  puts x.name # the role name
  puts x.wisp_name # wisp name, NOTE: Role does not really have this attribute, find_by_sql adds it
end

Модель

class Role < ActiveRecord::Base

      def self.do

        joins("LEFT JOIN wisps w ON
                w.id = roles.id").select("roles.*,
                                          wisps.name AS wisp_name")    

      end

    end

контроллер

@roles = Role.do

@wisps = @roles.map {|i| i.wisp_name}

Посмотреть

<%= @wisps %>
Другие вопросы по тегам