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 %>