11089


Postクラスがあり、Where句を使って複数Postを検索するとそのオブジェクト型はPost型に入っています。

[code]

    @posts.where(state: 'published')
    
    pry> @posts
    => [#<Post id: 12, name: "1st post" state: "published", user_id: 4, created_at: "2015-06-05 08:03:09", updated_at: "2015-06-05 12:41:53">,
     #<Post id: 23, name: "14th post" state: "published", user_id: 3, created_at: "2015-06-15 18:30:08", updated_at: "2015-06-15 18:30:08">]
    
    pry> @posts.class
    => Post::ActiveRecord_Relation
    
[/code]

この状態だと、Postクラスに指定したメソッドが使えます。

ところが、あるインスタンス変数(@instance)でそれは配列の中にPost型が入っている状態で得られます。

[code]

    pry> @instance
    => [#<Post id: 12, name: "1st post" state: "published", user_id: 4, created_at: "2015-06-05 08:03:09", updated_at: "2015-06-05 12:41:53">,
    #<Post id: 23, name: "14th post" state: "published", user_id: 3, created_at: "2015-06-15 18:30:08", updated_at: "2015-06-15 18:30:08">]
    
    pry> @instance.class
    => Array
    
[/code]

この型だと当然ながらPostクラスに指定したメソッドが使えません。  
`NoMethodError - undefined method 'search' for #<Array:`  
ではじかれます。  
解決するには配列の型をPost型に変換するべきと思うのですが、どうすればいいのでしょうか？


CC BY-SA 3.0
2015-06-07T13:24:43.847
11078
2015-06-08T02:03:37.510
9202
question
ruby-on-rails ruby rails-activerecord
配列の中にオブジェクト型が入っているインスタンス変数をWhere句で得られる結果と同じオブジェクト型に変換する方法は？


> Postクラスがあり、Where句を使って複数Postを検索するとそのオブジェクト型はPost型に入っています。

正確には`Post`クラスではなく`Post::ActiveRecord_Relation`クラスでこれは`ActiveRecord::Relation`のサブクラスです。

さて、一度配列になったものを`ActiveRecord::Relation`に戻す機能は無かったと思います。

ただ、勝手に配列に変換されることもないので、どこかの処理で配列にしてしまっているのだと思います。その処理を見直すことでしょうか。

または配列から`id`だけ引っ張り出して検索しなおすかです。

ところで、`search`メソッドは`ActiveRecord::Relation`にもないので、質問の例では`@posts.search`とやってもやはりundefined
methodになるはずです。


CC BY-SA 3.0
2015-06-08T01:04:18.730
11087
2015-06-08T01:04:18.730
5793
11078
answer


本当はinstanceが配列になる前に、

[code]

    @posts = Post.where(state: 'published')
    @instance = @posts.to_a
    
[/code]

というようにし、`@posts`を使って別のクエリは扱うようにするのがいいと思います。

ただ、そういうのが難しい、もしくはめんどくさい場合、

[code]

    Post.where(id: @instance)
    
[/code]

とすれば、解決できます。

結局idを元にDBを引き直しているだけですが。


CC BY-SA 3.0
2015-06-08T02:03:37.510
11089
2015-06-08T02:03:37.510
5962
11078
answer