質問編集履歴

7

細かい説明を追加

2019/04/10 01:22

投稿

aa37971
aa37971

スコア24

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 下記Modelを定義していて
2
2
 
3
- ```
3
+ ```ruby:
4
4
 
5
5
  class Maker < ApplicationRecord
6
6
 
@@ -58,27 +58,63 @@
58
58
 
59
59
 
60
60
 
61
- ### コントローラ上で下記を実現したです
61
+ ### 下記データが登録されてる時に
62
+
63
+ ```
64
+
65
+ @Maker Table @Tag Table @Note Table
66
+
67
+ id | name id | name id | name | maker_id
68
+
69
+ ------------ ------------- -----------------------
70
+
71
+ 1 | maker1 1 | tag1 1 | note1 | 1
72
+
73
+ 2 | maker2 2 | tag2 2 | note2 | 2
74
+
75
+ 3 | tag3
62
76
 
63
77
 
64
78
 
79
+ @TagRelation Table
80
+
81
+ id | note_id | tag_id
82
+
83
+ -----------------------
84
+
85
+ 1 | 1 | 1
86
+
87
+ 2 | 2 | 2
88
+
89
+ 3 | 2 | 3
90
+
65
91
  ```
66
92
 
67
- params0 = {
68
93
 
94
+
95
+
96
+
97
+ ### コントローラ上で(permit後の)下記パラメータでNoteにsaveしたい
98
+
99
+
100
+
101
+ ```ruby:
102
+
103
+ params = {
104
+
69
- name: 'note0',
105
+ name: 'note3',
70
106
 
71
107
  maker_attributes: {
72
108
 
73
- name: 'maker',
109
+ name: 'maker1',
74
110
 
75
111
  },
76
112
 
77
113
  tags_attributes: [
78
114
 
79
- {name: 'tag0'},
115
+ {name: 'tag1'},
80
116
 
81
- {name: 'tag1'},
117
+ {name: 'tag4'},
82
118
 
83
119
  ],
84
120
 
@@ -86,41 +122,11 @@
86
122
 
87
123
  ```
88
124
 
89
- を宣言して`Note.new(params0).save`した後に、 下記パラメータも `save` したいのです。
90
125
 
91
126
 
92
127
 
93
- ```
94
128
 
95
- params1 = {
96
-
97
- name: 'note1',
98
-
99
- maker_attributes: {
100
-
101
- name: 'maker',
102
-
103
- },
104
-
105
- tags_attributes: [
106
-
107
- {name: 'tag1'},
108
-
109
- {name: 'tag2'},
110
-
111
- ],
112
-
113
- }
114
-
115
- ```
116
-
117
- 具体的には`Note.new(params1).save`です!
118
-
119
-
120
-
121
- ### バリデーションエラー
129
+ ### 発生するバリデーションエラー
122
-
123
- 下記が発生します。
124
130
 
125
131
  ```
126
132
 
@@ -136,12 +142,50 @@
136
142
 
137
143
 
138
144
 
139
- ### 質問したいこと
145
+ ### 具体的に実行したいこと
140
146
 
141
- `Note` から `belongs_to :maker` ーションテーブルを使って `has_one` にするのも考えているのですが、結局は `tags` に対するエラーが解決できず・・・
147
+ `Note.new(params).save` すると、上記のバーションエラーが発生します
142
148
 
143
-
149
+ `maker.name` も `tags[x].name` も `uniqueness: true` なので当然ですが。。。
144
150
 
145
- `accepts_nested_attributes_for` を使ってうまくいかず。。。
146
151
 
152
+
147
- どうても `uniqueness` 制約かかる教えていただきたく :bow:
153
+ 実施たいのは、`Maker` `Tag` の両テーブル登録済データ(`name`カラム)があれば
154
+
155
+ レコードを増やす事なく、勝手に`Note`からリレーションを貼ってもらいたいのです。
156
+
157
+
158
+
159
+ 動作イメージとしては、下記のようになります。
160
+
161
+ ```ruby
162
+
163
+ note = Note.new(params)
164
+
165
+ # バリデーションに成功する
166
+
167
+ note.valid? # => true
168
+
169
+
170
+
171
+ # Makerは登録済のレコードなので、対象のレコードを持ってくる
172
+
173
+ note.maker # => Maker(id: 1, name: 'maker1')
174
+
175
+ # tags[0]は登録済のレコードなので対象を持ってくるが、 tags[1]は新規
176
+
177
+ note.tags # => [Tag(id: 1, name: 'tag1'), Tag(id: nil, name: 'tag4')]
178
+
179
+
180
+
181
+ note.save # => true
182
+
183
+ ```
184
+
185
+
186
+
187
+ 現状、考えられるのは `Note` の `before_validation` で各モデルに `find_or_initialize` するしかないかなと考えているのですが、
188
+
189
+ `validates` や `accepts_nested_attributes_for` に有効なオプションや、他に手法があれば教えていただきたいです!
190
+
191
+ よろしくおねがいします :bow:

6

インデックス間違い

2019/04/10 01:22

投稿

aa37971
aa37971

スコア24

test CHANGED
File without changes
test CHANGED
@@ -128,7 +128,7 @@
128
128
 
129
129
  :"maker.name" => ["has already been taken"]
130
130
 
131
- :"tags[1].name" => ["has already been taken"]
131
+ :"tags[0].name" => ["has already been taken"]
132
132
 
133
133
  }
134
134
 

5

バリデーションエラーの詳細を記述

2019/04/05 02:52

投稿

aa37971
aa37971

スコア24

test CHANGED
File without changes
test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
  ```
88
88
 
89
- を`Note.new(params0).save`した後に、
89
+ 宣言して`Note.new(params0).save`した後に、 下記パラメータも `save` したいのです。
90
90
 
91
91
 
92
92
 
@@ -114,9 +114,25 @@
114
114
 
115
115
  ```
116
116
 
117
- 上記も`Note.new(params1).save`したいのです!
117
+ 具体的には`Note.new(params1).save`です!
118
118
 
119
+
120
+
121
+ ### バリデーションエラー
122
+
123
+ 下記が発生します。
124
+
125
+ ```
126
+
127
+ {
128
+
129
+ :"maker.name" => ["has already been taken"]
130
+
119
- バリデーションエラーとして、 `{:"tags[1].name" => ["has already been taken"]}` が発生します。
131
+ :"tags[1].name" => ["has already been taken"]
132
+
133
+ }
134
+
135
+ ```
120
136
 
121
137
 
122
138
 

4

詳細を記述

2019/04/05 02:51

投稿

aa37971
aa37971

スコア24

test CHANGED
File without changes
test CHANGED
@@ -38,9 +38,17 @@
38
38
 
39
39
  belongs_to :maker
40
40
 
41
+ accepts_nested_attributes_for :maker
42
+
43
+
44
+
41
45
  has_many :relations, class_name: 'TagRelation'
42
46
 
43
- has_many :tag, through: :relations, source: :tag
47
+ has_many :tags, through: :relations, source: :tag
48
+
49
+ accepts_nested_attributes_for :tags
50
+
51
+
44
52
 
45
53
  validates :name, presence: true, uniqueness: true
46
54
 
@@ -50,13 +58,13 @@
50
58
 
51
59
 
52
60
 
53
- ### 下記を実現したいです
61
+ ### コントローラ上で下記を実現したいです
54
62
 
55
63
 
56
64
 
57
65
  ```
58
66
 
59
- Note.new({
67
+ params0 = {
60
68
 
61
69
  name: 'note0',
62
70
 
@@ -74,15 +82,17 @@
74
82
 
75
83
  ],
76
84
 
77
- }).save
85
+ }
78
86
 
79
87
  ```
80
88
 
81
- した後に、
89
+ を`Note.new(params0).save`した後に、
90
+
91
+
82
92
 
83
93
  ```
84
94
 
85
- Note.new({
95
+ params1 = {
86
96
 
87
97
  name: 'note1',
88
98
 
@@ -100,11 +110,13 @@
100
110
 
101
111
  ],
102
112
 
103
- }).save
113
+ }
104
114
 
105
115
  ```
106
116
 
107
- したいのです!
117
+ 上記も`Note.new(params1).save`したいのです!
118
+
119
+ → バリデーションエラーとして、 `{:"tags[1].name" => ["has already been taken"]}` が発生します。
108
120
 
109
121
 
110
122
 
@@ -114,6 +126,6 @@
114
126
 
115
127
 
116
128
 
117
- `accepts_nested_attributes_for` を使えばうまくいなと思っているのですが、
129
+ `accepts_nested_attributes_for` を使ってうまくいかず。。。
118
130
 
119
131
  どうしても `uniqueness` 制約にかかるので、教えていただきたく :bow:

3

タグ追加

2019/04/05 02:36

投稿

aa37971
aa37971

スコア24

test CHANGED
File without changes
test CHANGED
File without changes

2

タイトル変更

2019/04/04 09:48

投稿

aa37971
aa37971

スコア24

test CHANGED
@@ -1 +1 @@
1
- リレーションのあるマスターテーブルを同時に追加したい
1
+ 【Rails】リレーションのあるマスターテーブルを同時に追加したい
test CHANGED
File without changes

1

タグ追加

2019/04/04 01:49

投稿

aa37971
aa37971

スコア24

test CHANGED
File without changes
test CHANGED
File without changes