質問編集履歴

4

補足情報の追加

2016/12/12 12:21

投稿

akai
akai

スコア39

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ###前提・実現したいこと
2
2
 
3
- 以下のような構成のmodelがあるとしたときに、これらを一度のsaveで同時作成したいです。
3
+ 以下のような構成のmodelがあるとしたときに、これらを**一度のsaveで同時作成したい**です。
4
4
 
5
5
 
6
6
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  # id
12
12
 
13
- has_many :user_jobs
13
+ has_many :user_jobs, inverse_of: :user
14
14
 
15
15
  has_many :contacts
16
16
 
@@ -36,7 +36,7 @@
36
36
 
37
37
  accepts_nested_attributes_for :contact
38
38
 
39
- validates :user_id, presence: true
39
+ validates :user, presence: true # inverse_ofを利用しているのでpresenceは:user_idではなく:user
40
40
 
41
41
  ```
42
42
 
@@ -74,7 +74,7 @@
74
74
 
75
75
  # 試行1
76
76
 
77
- u = User.create(contacts_attributes: [{ user_job_attributes: {}])
77
+ u = User.create(contacts_attributes: [{ user_job_attributes: {} }])
78
78
 
79
79
  # u.errors => contacts.user_jobs.user_id を入力してください
80
80
 
@@ -82,7 +82,7 @@
82
82
 
83
83
  # 試行2
84
84
 
85
- c = Contact.create(personal_attributes: { user_jobs_attributes: [{}] })
85
+ c = Contact.create(user_attributes: { user_jobs_attributes: [{}] })
86
86
 
87
87
  # c.errors => user.user_jobs.user_id を入力してください
88
88
 
@@ -90,9 +90,53 @@
90
90
 
91
91
 
92
92
 
93
- いろいろ試したのですが、*_attributesやbuildなどを使用して(ActiveRecord::Base.transactionを書かずにRailsっぽく)、
93
+ いろいろ試したのですが、paramsを整形、もしくは*_attributesやbuildなどを使用して(ApplicationRecord.transactionを書かずにRailsっぽく)、
94
94
 
95
95
  トランザクション内でsaveする方法はないのでしょうか?
96
+
97
+
98
+
99
+ ###2016-12-12追記
100
+
101
+ - inverse_ofが必要そうなので、modelを若干修正しました。
102
+
103
+
104
+
105
+ - 目的としましては以下のようなコードで実現できますが、こちらを「Railsの機能でもっとイイカンジに書けるのではないか」、と考えています。
106
+
107
+ ```ruby
108
+
109
+ def create
110
+
111
+ # user_params => { user_jobs_attributes: [{}] }
112
+
113
+ # viewでは@user.errorsをeachで回したいので@userのスコープをtransactionの外に
114
+
115
+ @user = User.new(user_params)
116
+
117
+ ApplicationRecord.transaction do
118
+
119
+ @user = User.save
120
+
121
+ @user.user_jobs.each do |user_job|
122
+
123
+ @user.update(user_jobs_attributes: [id: user_job.id, contact_attributes: { user_id: @user.id }])
124
+
125
+ end
126
+
127
+ raise if @user.errors.present? # validationエラーがあれば例外を発生させ、rescueで拾う
128
+
129
+ redirect_to @user, notice: '更新に成功しました'
130
+
131
+ rescue
132
+
133
+ render :new
134
+
135
+ end
136
+
137
+ end
138
+
139
+ ```
96
140
 
97
141
 
98
142
 

3

ファイル名の修正

2016/12/12 12:21

投稿

akai
akai

スコア39

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- user.model.rb
7
+ user.rb
8
8
 
9
9
  ```ruby
10
10
 
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- user_job.model.rb
25
+ user_job.rb
26
26
 
27
27
  ```ruby
28
28
 
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- contact.model.rb
45
+ contact.rb
46
46
 
47
47
  ```ruby
48
48
 

2

タイトルの修正

2016/12/12 01:47

投稿

akai
akai

スコア39

test CHANGED
@@ -1 +1 @@
1
- 【Rails】 複数外部キーを持つ3以上のテーブ、一度に作成したい
1
+ 【Rails】 複数外部キーを持つ3以上のモデから、一度にレコードを作成したい
test CHANGED
File without changes

1

タイトルを変更

2016/10/19 07:31

投稿

akai
akai

スコア39

test CHANGED
@@ -1 +1 @@
1
- 複数外部キーを持つ3以上のテーブルを、一度に作成したい
1
+ 【Rails】 複数外部キーを持つ3以上のテーブルを、一度に作成したい
test CHANGED
File without changes