質問編集履歴

3

メソッド名変更

2018/10/20 13:49

投稿

hoimi_man
hoimi_man

スコア10

test CHANGED
File without changes
test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ```
40
40
 
41
- def display_stock_status
41
+ def display_free_status
42
42
 
43
43
  free_dates_count = first.free_for_60_days.size
44
44
 

2

カラム名のみす

2018/10/20 13:49

投稿

hoimi_man
hoimi_man

スコア10

test CHANGED
File without changes
test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
  has_many :free_days, dependent: :destroy
80
80
 
81
- has_many :free_for_60_days, -> { where(stocked_on: Date.today..(Date.today + 59.days)) }, class_name: 'FreeDay'
81
+ has_many :free_for_60_days, -> { where(free_on_on: Date.today..(Date.today + 59.days)) }, class_name: 'FreeDay'
82
82
 
83
83
  ```
84
84
 
@@ -112,7 +112,7 @@
112
112
 
113
113
  if @target_date.present?
114
114
 
115
- @card = @card.includes(user: :free_days).where(user: {free_days: {stocked_on: @target_date }})
115
+ @card = @card.includes(user: :free_days).where(user: {free_days: {free_on: @target_date }})
116
116
 
117
117
 
118
118
 
@@ -164,13 +164,13 @@
164
164
 
165
165
  `includes→joinsに変更`
166
166
 
167
- > @card = @card.includes(user: :free_days).where(user: {free_days: {stocked_on: @target_date }})
167
+ > @card = @card.includes(user: :free_days).where(user: {free_days: {free_on: @target_date }})
168
168
 
169
169
  ↑こちらを↓に変更したらきちんと`free_for_60_days.size`が適正な値(1)で算出されましたがN+1が発生してしまいました。
170
170
 
171
171
 
172
172
 
173
- `@card = @card.joins(user: :free_days).merge(FreeDay.where(stocked_on: @target_date)).distinct`
173
+ `@card = @card.joins(user: :free_days).merge(FreeDay.where(free_on: @target_date)).distinct`
174
174
 
175
175
 
176
176
 

1

間違えて何も書かずに投稿してしまました

2018/10/19 07:07

投稿

hoimi_man
hoimi_man

スコア10

test CHANGED
File without changes
test CHANGED
@@ -10,48 +10,182 @@
10
10
 
11
11
  sizeでカウントした空き日の数に誤差が出てしまいます。
12
12
 
13
- 例) 本当は空き
13
+ 例) 本当は空き日は`1日`
14
14
 
15
15
  ```
16
16
 
17
17
  # helper.rb
18
18
 
19
- free_for_60_days.size
19
+ User.first.free_for_60_days.size
20
+
21
+ →0
22
+
23
+
24
+
25
+ リレーションを使わないと正確に算出される(しかしN+1が起きる)
26
+
27
+ User.first.where(free_on: Date.today..(Date.today + 29.days)).size
28
+
29
+ →1
30
+
31
+ ```
32
+
33
+
34
+
35
+ ## ソースコード
36
+
37
+ `user_decorator.rb`
38
+
39
+ ```
40
+
41
+ def display_stock_status
42
+
43
+ free_dates_count = first.free_for_60_days.size
44
+
45
+ if free_dates_count == 0
46
+
47
+ 'nothing_free'
48
+
49
+ elsif free_dates_count <= 5
50
+
51
+ 'a_little_free'
52
+
53
+ else free_dates_count > 5
54
+
55
+ 'free'
56
+
57
+ end
58
+
59
+ end
60
+
61
+
20
62
 
21
63
  →0
22
64
 
23
65
  ```
24
66
 
67
+
68
+
69
+ `user.rb`
70
+
71
+
72
+
25
73
  ```
26
74
 
27
- エラーメッセージ
75
+ class User < ApplicationRecord
76
+
77
+
78
+
79
+ has_many :free_days, dependent: :destroy
80
+
81
+ has_many :free_for_60_days, -> { where(stocked_on: Date.today..(Date.today + 59.days)) }, class_name: 'FreeDay'
28
82
 
29
83
  ```
30
84
 
31
85
 
32
86
 
33
- ### 該当のソースコード
87
+ `free_days.rb`
34
88
 
89
+ ```
35
90
 
91
+ class StockDay < ApplicationRecord
36
92
 
37
- ```ここに言語名を入力
93
+ belongs_to :user
38
-
39
- ソースコード
40
94
 
41
95
  ```
42
96
 
43
97
 
44
98
 
99
+ `cards_controller.rb`
100
+
101
+ ```
102
+
45
- ### 試したこと
103
+ def index
46
104
 
47
105
 
48
106
 
107
+
108
+
49
- ここに問題に対して試したことを記載してください。
109
+ @cards = Card.all.page(params[:page])
50
110
 
51
111
 
52
112
 
53
- ### 補足情報(FW/ツールのバージョンなど)
113
+ if @target_date.present?
114
+
115
+ @card = @card.includes(user: :free_days).where(user: {free_days: {stocked_on: @target_date }})
116
+
117
+
118
+
119
+ end
54
120
 
55
121
 
56
122
 
123
+ if @target_area.present?
124
+
125
+ @cards = @cards.includes(user: :cities).joins(user: :cities).merge(Users::City.where(city: @target_area.city)).distinct
126
+
127
+ end
128
+
129
+
130
+
131
+ @cards = @cards.includes(:free_for_60_days).decorate
132
+
133
+
134
+
135
+ end
136
+
137
+ ```
138
+
139
+
140
+
141
+ `_cards.html.haml`
142
+
143
+
144
+
145
+ ```
146
+
147
+ - @cards.each do|card|
148
+
149
+ .col-xs-12.col-md-3.col-sm-6.card-list
150
+
151
+ .card{ class: "#{card.user.decorate.display_free_condition}"}
152
+
153
+ ```
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+ ### 試したこと
164
+
57
- ここより詳細な情報を記載してください。
165
+ `includes→joins変更`
166
+
167
+ > @card = @card.includes(user: :free_days).where(user: {free_days: {stocked_on: @target_date }})
168
+
169
+ ↑こちらを↓に変更したらきちんと`free_for_60_days.size`が適正な値(1)で算出されましたがN+1が発生してしまいました。
170
+
171
+
172
+
173
+ `@card = @card.joins(user: :free_days).merge(FreeDay.where(stocked_on: @target_date)).distinct`
174
+
175
+
176
+
177
+
178
+
179
+ おそらく`includes`のキャッシュに問題があると思うのですが解決方法がわかりません。どなたかご教授ください。
180
+
181
+
182
+
183
+
184
+
185
+ ### 参考記事
186
+
187
+ **has_manyをeager_load/includesするときの注意点**
188
+
189
+
190
+
191
+ https://qiita.com/metheglin/items/c6d3b04e1305f7ec5d96