回答編集履歴
4
使わない関数が残っていたため削除
answer
CHANGED
@@ -14,17 +14,6 @@
|
|
14
14
|
class GroupPost < ApplicationRecord
|
15
15
|
belongs_to :group
|
16
16
|
belongs_to :post
|
17
|
-
|
18
|
-
def post
|
19
|
-
return Post.where(id: self.post_id)
|
20
|
-
end
|
21
|
-
def self.search(search) #self.でクラスメソッドとしている
|
22
|
-
if
|
23
|
-
Post.where(title: "#{search}")
|
24
|
-
else
|
25
|
-
Post.all #全て表示。
|
26
|
-
end
|
27
|
-
end
|
28
17
|
end
|
29
18
|
```
|
30
19
|
|
3
searchの記述ミス
answer
CHANGED
@@ -33,6 +33,7 @@
|
|
33
33
|
def show
|
34
34
|
@group = Group.find_by(id: params[:id])
|
35
35
|
if params[:search]
|
36
|
+
search = params[:search]
|
36
37
|
@posts = @group.posts.where(title: "#{search}")
|
37
38
|
else
|
38
39
|
@posts = @group.posts
|
2
以前の回答ですと解決できなかったため大幅書き換え
answer
CHANGED
@@ -1,34 +1,44 @@
|
|
1
|
-
|
1
|
+
すみません、以下のように大幅に書き換えた場合にはどうなりますでしょうか?
|
2
2
|
|
3
3
|
model
|
4
4
|
```ruby
|
5
|
+
class Group < ApplicationRecord
|
6
|
+
has_many :group_posts, dependent: :destroy
|
7
|
+
has_many :posts, through: :group_posts
|
8
|
+
end
|
9
|
+
class Post < ApplicationRecord
|
10
|
+
has_many :group_posts, dependent: :destroy
|
11
|
+
has_many :groups, through: :group_posts
|
12
|
+
end
|
13
|
+
|
14
|
+
class GroupPost < ApplicationRecord
|
15
|
+
belongs_to :group
|
5
|
-
|
16
|
+
belongs_to :post
|
17
|
+
|
18
|
+
def post
|
6
|
-
|
19
|
+
return Post.where(id: self.post_id)
|
20
|
+
end
|
21
|
+
def self.search(search) #self.でクラスメソッドとしている
|
22
|
+
if
|
23
|
+
Post.where(title: "#{search}")
|
24
|
+
else
|
25
|
+
Post.all #全て表示。
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
7
29
|
```
|
8
30
|
|
9
31
|
controller
|
10
32
|
```ruby
|
33
|
+
def show
|
34
|
+
@group = Group.find_by(id: params[:id])
|
35
|
+
if params[:search]
|
11
|
-
@posts = @group.
|
36
|
+
@posts = @group.posts.where(title: "#{search}")
|
37
|
+
else
|
38
|
+
@posts = @group.posts
|
39
|
+
end
|
40
|
+
end
|
12
41
|
```
|
13
|
-
これを実行することで、postメソッドではなく、postスコープとして実行できます。
|
14
42
|
|
15
|
-
|
16
|
-
|
43
|
+
GroupPostモデルに定義した関数でなんとかしようとしていたところ、改めて見るといろいろ変更が効くと思ったので大幅に書き換えました。おそらくこれでやりたかったことはできるはずです。
|
17
|
-
|
18
|
-
@group.group_postsを実行すると一見問題なさそうですが、取得されるオブジェクトのクラスは
|
19
|
-
**GroupPost::ActiveRecord_Associations_CollectionProxy**
|
20
|
-
になります。なんじゃこりゃ!と思うかもしれませんが、かなーりざっくりと説明するのであれば、絞り込み条件にマッチしたGroupPostオブジェクトの配列とイメージしていただければと思います。
|
21
|
-
|
22
|
-
**イメージ:[GroupPost, GroupPost, GroupPost]**
|
23
|
-
※実際にはもっと違う性質があるので、あくまで今回の問題を解決するためだけのイメージとして考えてください。詳しくは調べてみてください!
|
24
|
-
|
25
|
-
ですので、@group.group_posts.postでのpostメソッドは配列にpostメソッドを実行させているようなものになり、エラーになってしまいます。
|
26
|
-
|
27
|
-
@group.group_postsに適当にインデックスをつけて@group.group_posts.post[0]とすると、ただひとつのGroupPostオブジェクトを指定することができますので、これに対してはpostメソッドは利用できます。
|
28
|
-
|
44
|
+
こちらで実行などはしてないので、エラーがあれば教えて下さい。
|
29
|
-
|
30
|
-
|
31
|
-
という理由でpostメソッドは利用できなかったのですが、今回の用途を考えるとスコープを使ったほうが使いやすいのではないかと思い、提案させていただきました。
|
32
|
-
https://qiita.com/ozin/items/24d1b220a002004a6351
|
33
|
-
|
34
|
-
ご確認をお願いします。
|
1
post_id -> post.id
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
model
|
4
4
|
```ruby
|
5
5
|
# GroupPostモデル内に定義
|
6
|
-
scope :post, -> { where(id:
|
6
|
+
scope :post, -> { where(id: post.id) }
|
7
7
|
```
|
8
8
|
|
9
9
|
controller
|