teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

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

2021/03/28 00:55

投稿

yoshi_10_11
yoshi_10_11

スコア241

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の記述ミス

2021/03/28 00:55

投稿

yoshi_10_11
yoshi_10_11

スコア241

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

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

2021/03/26 16:31

投稿

yoshi_10_11
yoshi_10_11

スコア241

answer CHANGED
@@ -1,34 +1,44 @@
1
- postメソッドでidによる絞り込を設定したいようでしが、メソッドでなくscopeを使のはいかがでしょうか?
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
- # GroupPostモデル内に定義
16
+ belongs_to :post
17
+
18
+ def post
6
- scope :post, -> { where(id: post.id) }
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.group_posts.post.search(params[:search])
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
- 、postメソッドはうまくいかなかったのは、**GroupPostオブジェクトが実行できるメソッドとして定義しているのに、違うオブジェクトから実行をしてし**、です。
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
- @group.group_posts[0].post
44
+ こちらで実行などはしてないので、エラーがあれば教えて下さい。
29
-
30
-
31
- という理由でpostメソッドは利用できなかったのですが、今回の用途を考えるとスコープを使ったほうが使いやすいのではないかと思い、提案させていただきました。
32
- https://qiita.com/ozin/items/24d1b220a002004a6351
33
-
34
- ご確認をお願いします。

1

post_id -> post.id

2021/03/26 16:29

投稿

yoshi_10_11
yoshi_10_11

スコア241

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  model
4
4
  ```ruby
5
5
  # GroupPostモデル内に定義
6
- scope :post, -> { where(id: post_id) }
6
+ scope :post, -> { where(id: post.id) }
7
7
  ```
8
8
 
9
9
  controller