回答編集履歴

4

moke

moke score 2199

2017/05/01 14:10  投稿

基本的に、find_by_sqlはactive_recordsの良さを半分捨てる苦肉の策ということ
覚えておいてください。できるだけ生SQLを使わないで書くことをオススメします。
squeel等のgemやArelも検討してください。
polymorphicに関しては一つづつ定義するしか方法がなかった気がします。
ただ、polymorphicの対象が、有限ならあらかじめ
```ruby
class notice < ActiveRecord::Base
  belongs_to :object, polymorphic: true
  has_one :self_ref, :class_name => self, :foreign_key => :id
  has_one :post ,:through => :self_ref, :source => :object, source_type: 'Post'
  has_one :article ,:through => :self_ref, :source => :object, source_type: 'Article'
end
```
などと個々の関係を定義しておいて
(上記は自己結合を介することでpolymorphicを綺麗にまとめる技です。
polymorphic関係を憶測で書くと地味にやばいことになります。)
```ruby  
ActiveRecord::Associations::Preloader.new.preload(@notices, [{post: :user},{article: :adminuser}])
```  
というふうにすることもできると思います。
※未確認情報ですので、うまくいったら報告ください。
3

moke

moke score 2199

2017/05/01 14:10  投稿

基本的に、find_by_sqlはactive_recordsの良さを半分捨てる苦肉の策ということ
覚えておいてください。できるだけ生SQLを使わないで書くことをオススメします。
squeel等のgemやArelも検討してください。
polymorphicに関しては一つづつ定義するしか方法がなかった気がします。
ただ、polymorphicの対象が、有限ならあらかじめ
```ruby
class notice < ActiveRecord::Base
  belongs_to :object, polymorphic: true
  has_one :self_ref, :class_name => self, :foreign_key => :id
  has_one :post ,:through => :self_ref, :source => :object, source_type: 'Post'
  has_one :article ,:through => :self_ref, :source => :object, source_type: 'Article'
end
```
などと個々の関係を定義しておいて
(上記は自己結合を介することでpolymorphicを綺麗にまとめる技です。
polymorphic関係を憶測で書くと地味にやばいことになります。)
```ruby  
ActiveRecord::Associations::Preloader.new.preload(@notices, [{post: :user},{article: :adminuser}])
```  
というふうにすることもできると思います。
※未確認情報ですので、うまくいったら報告ください。
2

moke

moke score 2199

2017/05/01 14:09  投稿

基本的に、find_by_sqlはactive_recordsの良さを半分捨てる苦肉の策ということ
覚えておいてください。できるだけ生SQLを使わないで書くことをオススメします。
polymorphicに関しては一つづつ定義するしか方法がなかった気がします。
ただ、polymorphicの対象が、有限ならあらかじめ
```ruby
class notice < ActiveRecord::Base
  belongs_to :object, polymorphic: true
  has_one :self_ref, :class_name => self, :foreign_key => :id
  has_one :post ,:through => :self_ref, :source => :object, source_type: 'Post'
  has_one :article ,:through => :self_ref, :source => :object, source_type: 'Article'
end
```
などと個々の関係を定義しておいて
(上記は自己結合を介することでpolymorphicを綺麗にまとめる技です。
polymorphic関係を憶測で書くと地味にやばいことになります。)
ActiveRecord::Associations::Preloader.new.preload(@notices, [{post: :user},{article: :adminuser}])
というふうにすることもできると思います。
※未確認情報ですので、うまくいったら報告ください。
1

moke

moke score 2199

2017/05/01 14:08  投稿

基本的に、find_by_sqlはactive_recordsの良さを半分捨てる苦肉の策ということ
覚えておいてください。できるだけ生SQLを使わないで書くことをオススメします。
squeel等のgemも検討してください。
polymorphicに関しては一つづつ定義するしか方法がなかった気がします。
ただ、polymorphicの対象が、有限ならあらかじめ
```ruby
class notice < ActiveRecord::Base
  belongs_to :object, polymorphic: true
  has_one :self_ref, :class_name => self, :foreign_key => :id
  has_one :post ,:through => :self_ref, :source => :object, source_type: 'Post'
  has_one :article ,:through => :self_ref, :source => :object, source_type: 'Article'
end
```
などと個々の関係を定義しておいて
(上記は自己結合を介することでpolymorphicを綺麗にまとめる技です。
polymorphic関係を憶測で書くと地味にやばいことになります。)
ActiveRecord::Associations::Preloader.new.preload(@notices, object: [:user, :adminuser, :post])
ActiveRecord::Associations::Preloader.new.preload(@notices, [{post: :user},{article: :adminuser}])
というふうにすることもできると思います。
※未確認情報ですので、うまくいったら報告ください。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る