回答編集履歴

4

使わない関数が残っていたため削除

2021/03/28 00:55

投稿

yoshi_10_11
yoshi_10_11

スコア241

test CHANGED
@@ -29,28 +29,6 @@
29
29
  belongs_to :group
30
30
 
31
31
  belongs_to :post
32
-
33
-
34
-
35
- def post
36
-
37
- return Post.where(id: self.post_id)
38
-
39
- end
40
-
41
- def self.search(search) #self.でクラスメソッドとしている
42
-
43
- if
44
-
45
- Post.where(title: "#{search}")
46
-
47
- else
48
-
49
- Post.all #全て表示。
50
-
51
- end
52
-
53
- end
54
32
 
55
33
  end
56
34
 

3

searchの記述ミス

2021/03/28 00:55

投稿

yoshi_10_11
yoshi_10_11

スコア241

test CHANGED
@@ -68,6 +68,8 @@
68
68
 
69
69
  if params[:search]
70
70
 
71
+ search = params[:search]
72
+
71
73
  @posts = @group.posts.where(title: "#{search}")
72
74
 
73
75
  else

2

以前の回答ですと解決できなかったため大幅書き換え

2021/03/26 16:31

投稿

yoshi_10_11
yoshi_10_11

スコア241

test CHANGED
@@ -1,4 +1,4 @@
1
- postメソッドでidによる絞り込を設定したいようでしが、メソッドではなくscopeを使うのはいかがでしょうか?
1
+ ません、以下のように大幅に書き換え場合にどうりますでしょうか?
2
2
 
3
3
 
4
4
 
@@ -6,9 +6,53 @@
6
6
 
7
7
  ```ruby
8
8
 
9
- # GroupPostモデル内に定義
9
+ class Group < ApplicationRecord
10
10
 
11
+ has_many :group_posts, dependent: :destroy
12
+
13
+ has_many :posts, through: :group_posts
14
+
15
+ end
16
+
17
+ class Post < ApplicationRecord
18
+
19
+ has_many :group_posts, dependent: :destroy
20
+
21
+ has_many :groups, through: :group_posts
22
+
23
+ end
24
+
25
+
26
+
27
+ class GroupPost < ApplicationRecord
28
+
29
+ belongs_to :group
30
+
31
+ belongs_to :post
32
+
33
+
34
+
35
+ def post
36
+
11
- scope :post, -> { where(id: post.id) }
37
+ return Post.where(id: self.post_id)
38
+
39
+ end
40
+
41
+ def self.search(search) #self.でクラスメソッドとしている
42
+
43
+ if
44
+
45
+ Post.where(title: "#{search}")
46
+
47
+ else
48
+
49
+ Post.all #全て表示。
50
+
51
+ end
52
+
53
+ end
54
+
55
+ end
12
56
 
13
57
  ```
14
58
 
@@ -18,50 +62,26 @@
18
62
 
19
63
  ```ruby
20
64
 
65
+ def show
66
+
67
+ @group = Group.find_by(id: params[:id])
68
+
69
+ if params[:search]
70
+
21
- @posts = @group.group_posts.post.search(params[:search])
71
+ @posts = @group.posts.where(title: "#{search}")
72
+
73
+ else
74
+
75
+ @posts = @group.posts
76
+
77
+ end
78
+
79
+ end
22
80
 
23
81
  ```
24
82
 
25
- これを実行することで、postメソッドではなく、postスコープとして実行できます。
26
83
 
27
84
 
85
+ GroupPostモデルに定義した関数でなんとかしようとしていたところ、改めて見るといろいろ変更が効くと思ったので大幅に書き換えました。おそらくこれでやりたかったことはできるはずです。
28
86
 
29
-
30
-
31
- また、postメソッドはうまくいかなかったのは、**GroupPostオブジェクトが実行できるメソッドとして定義しているのに、違うオブジェクトから実行をしてしまったから**、です。
32
-
33
-
34
-
35
- @group.group_postsを実行すると一見問題なさそうですが、取得されるオブジェクトのクラスは
36
-
37
- **GroupPost::ActiveRecord_Associations_CollectionProxy**
38
-
39
- になります。なんじゃこりゃ!と思うかもしれませんが、かなーりざっくりと説明するのであれば、絞り込み条件にマッチしたGroupPostオブジェクトの配列とイメージしていただければと思います。
40
-
41
-
42
-
43
- **イメージ:[GroupPost, GroupPost, GroupPost]**
44
-
45
- ※実際にはもっと違う性質があるので、あくまで今回の問題を解決するためだけのイメージとして考えてください。詳しくは調べてみてください!
46
-
47
-
48
-
49
- ですので、@group.group_posts.postでのpostメソッドは配列にpostメソッドを実行させているようなものになり、エラーになってしまいます。
50
-
51
-
52
-
53
- @group.group_postsに適当にインデックスをつけて@group.group_posts.post[0]とすると、ただひとつのGroupPostオブジェクトを指定することができますので、これに対してはpostメソッドは利用できます。
54
-
55
- @group.group_posts[0].post
87
+ こちらで実行などはしてないので、エラーがあれば教えて下さい。
56
-
57
-
58
-
59
-
60
-
61
- という理由でpostメソッドは利用できなかったのですが、今回の用途を考えるとスコープを使ったほうが使いやすいのではないかと思い、提案させていただきました。
62
-
63
- https://qiita.com/ozin/items/24d1b220a002004a6351
64
-
65
-
66
-
67
- ご確認をお願いします。

1

post_id -> post.id

2021/03/26 16:29

投稿

yoshi_10_11
yoshi_10_11

スコア241

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  # GroupPostモデル内に定義
10
10
 
11
- scope :post, -> { where(id: post_id) }
11
+ scope :post, -> { where(id: post.id) }
12
12
 
13
13
  ```
14
14