1

我实际上有这个模型:

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 字段,除了它返回一个散列而不是一个活动记录对象。

有没有办法代替检索活动记录对象?

Role 模型没有 belongs_to 并且 wisp 模型没有 has_many :roles ,我猜这是为了灵活性或其他原因(我没有开发我正在开发的应用程序)。

编辑:解决方案已实施

此处实施的解决方案:https ://github.com/nemesisdesign/OpenWISP-Geographic-Monitoring/blob/287861d95fffde35d78b76ca1e529c21b0f3a54b/app/models/role.rb#L25 感谢@house9

4

2 回答 2

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
于 2013-03-18T18:17:39.017 回答
1

模型

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 %>
于 2013-03-18T18:37:34.630 回答