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を追加します。

代わりにアクティブなレコードオブジェクトを取得する方法はありますか?

ロールモデルには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 に答える