<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>rails - shungo blog</title>
	<atom:link href="https://shungoblog.com/tag/rails/feed" rel="self" type="application/rss+xml" />
	<link>https://shungoblog.com</link>
	<description>しゅんごブログ</description>
	<lastBuildDate>Fri, 02 May 2025 11:19:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://shungoblog.com/wp-content/uploads/2022/04/cropped-IMG_0718-32x32.jpg</url>
	<title>rails - shungo blog</title>
	<link>https://shungoblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://shungoblog.com/tag/rails/feed"/>
	<item>
		<title>【MySQL】 外部キー制約 (restrict / cascade / set null)</title>
		<link>https://shungoblog.com/programming/mysql-foreign-key-constraint.html</link>
					<comments>https://shungoblog.com/programming/mysql-foreign-key-constraint.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Fri, 24 Feb 2023 12:15:31 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[rails]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1987</guid>

					<description><![CDATA[<p>Railsの場合、modelでdependent: :destroyなどで指定できる外部キー制約を MySQLの場合どのようにすれば指定できるかをまとめてみました。 目次 外部キー制約の種類動作確認restrictcas [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/mysql-foreign-key-constraint.html">【MySQL】 外部キー制約 (restrict / cascade / set null)</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Railsの場合、modelで<code>dependent: :destroy</code>などで指定できる外部キー制約を</p>
<p>MySQLの場合どのようにすれば指定できるかをまとめてみました。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">外部キー制約の種類</a></li><li><a href="#toc2" tabindex="0">動作確認</a><ol><li><a href="#toc3" tabindex="0">restrict</a></li><li><a href="#toc4" tabindex="0">cascade</a></li><li><a href="#toc5" tabindex="0">set null</a></li></ol></li><li><a href="#toc6" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">外部キー制約の種類</span></h2>
<p>まずは外部キー制約の種類です。</p>
<div class="scrollable-table"><table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr style="background: #cdcdcd;">
<td style="width: 30.464%;"><strong>外部キー制約</strong></td>
<td style="width: 69.536%;"><strong>親のデータを削除した時の挙動</strong></td>
</tr>
<tr>
<td style="width: 30.464%;">restrict</td>
<td style="width: 69.536%;">エラーになる(削除できない)</td>
</tr>
<tr>
<td style="width: 30.464%;">cascade</td>
<td style="width: 69.536%;">子のデータも消える</td>
</tr>
<tr>
<td style="width: 30.464%;">set null</td>
<td style="width: 69.536%;">childrenのparent_idがnullになる</td>
</tr>
</tbody>
</table></div>
<p>&nbsp;</p>
<h2><span id="toc2">動作確認</span></h2>
<p>テーブル作成、データ挿入して、親データを削除したときにどのような挙動になるかを確認してみます。</p>
<p>parentテーブルとchildrenテーブルを作成して、</p>
<p>parentデータ1件、それに紐づくchildrenデータを2件挿入します。</p>
<h3><span id="toc3">restrict</span></h3>
<p>テーブルを作成します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>create table parent (
  id bigint not null auto_increment,
  name varchar(255),
  primary key (id)
);

create table children (
  id bigint not null auto_increment,
  parent_id bigint not null,  -- NOTE: not null制約
  name varchar(255),
  primary key (id),
  foreign key (parent_id) references parent (id) on delete restrict -- NOTE: restrict制約
);</code></pre>
</div>
<p>次にデータ挿入します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>insert into parent (name) values ('name');

-- NOTE: parentに紐づくchidrenデータ
insert into children (name, parent_id) values ('children1', 1); 
insert into children (name, parent_id) values ('children2', 1);</code></pre>
</div>
<p>挿入したデータを確認します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; select * from parent;
+----+------+
| id | name |
+----+------+
|  1 | name |
+----+------+

mysql&gt; select * from children;
+----+-----------+-----------+
| id | parent_id | name      |
+----+-----------+-----------+
|  1 |         1 | children1 |
|  2 |         1 | children2 |
+----+-----------+-----------+</code></pre>
</div>
<p>この状態でparentデータを削除してみます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; delete from parent where id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row: 
a foreign key constraint fails (`development`.`children`, CONSTRAINT `children_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))
</code></pre>
</div>
<p><span class="marker-under-red">restrictの場合は、このように外部キーのエラーが出てデータを削除することができません。</span></p>
<p>&nbsp;</p>
<h3><span id="toc4">cascade</span></h3>
<p>続いてcascadeです。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>-- NOTE: 必要に応じてテーブルを削除してください。
drop table children;
drop table parent;

-- NOTE: テーブル作成
create table parent (
  id bigint not null auto_increment,
  name varchar(255),
  primary key (id)
);

create table children (
  id bigint not null auto_increment,
  parent_id bigint not null,　-- NOTE: not null制約
  name varchar(255),
  primary key (id),
  foreign key (parent_id) references parent (id) on delete cascade　-- NOTE: cascade制約
);</code></pre>
</div>
<p>こちらも同じくデータを挿入します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>insert into parent (name) values ('name');

-- NOTE: parentに紐づくchidrenデータ
insert into children (name, parent_id) values ('children1', 1); 
insert into children (name, parent_id) values ('children2', 1);</code></pre>
</div>
<p>この状態でparentデータを削除してみます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; delete from parent where id = 1;
Query OK, 1 row affected (0.02 sec)</code></pre>
</div>
<p>今度はデータを削除することができました。</p>
<p>selectでそれぞれのデータを確認してみます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; select * from parent;
Empty set (0.00 sec)

mysql&gt; select * from children;
Empty set (0.01 sec)</code></pre>
</div>
<p><span class="marker-under-red">cascadeの場合、親データを削除するとそれに紐づく子のデータも削除されていることが確認できます。</span></p>
<p>&nbsp;</p>
<h3><span id="toc5">set null</span></h3>
<p>最後にset nullです。</p>
<p>restrictとcascadeと異なり、parent_idにnullを許容することに注意しましょう。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>-- NOTE: 必要に応じてテーブルを削除してください。
drop table children;
drop table parent;

-- NOTE: テーブル作成
create table parent (
  id bigint not null auto_increment,
  name varchar(255),
  primary key (id)
);

create table children (
  id bigint not null auto_increment,
  parent_id bigint, -- NOTE: null許容
  name varchar(255),
  primary key (id),
  foreign key (parent_id) references parent (id) on delete set null -- NOTE: set null制約
);</code></pre>
</div>
<p>データを挿入します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>insert into parent (name) values ('name');

-- NOTE: parentに紐づくchidrenデータ
insert into children (name, parent_id) values ('children1', 1); 
insert into children (name, parent_id) values ('children2', 1);</code></pre>
</div>
<p><span>この状態でparentデータを削除してみます。</span></p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; delete from parent where id = 1;
Query OK, 1 row affected (0.02 sec)</code></pre>
</div>
<p>データを削除することができたのでデータを確認してみます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-sql" data-lang="SQL"><code>mysql&gt; select * from parent;
Empty set (0.01 sec)

mysql&gt; select * from children;
+----+-----------+-----------+
| id | parent_id | name      |
+----+-----------+-----------+
|  1 |      NULL | children1 |
|  2 |      NULL | children2 |
+----+-----------+-----------+
2 rows in set (0.00 sec)</code></pre>
</div>
<p><span class="marker-under-red">親のデータは削除されており、子のデータは残っています。</span></p>
<p><span class="marker-under-red">set nullを指定しているので、parent_idはnullになっていることが確認できます。</span></p>
<p>&nbsp;</p>
<h2><span id="toc6">まとめ</span></h2>
<p>外部キー制約のrestrict, cascade, set nullの設定方法と挙動について確認しました。</p>
<p>必要に応じて外部キー制約を付与して、データの安全性を担保しましょう！</p>
<p>&nbsp;</p>
<div class="blogcard-type bct-together">

<a target="_blank" href="https://shungoblog.com/docker-mysql-sequel-pro/" title="DockerのMySQLコンテナにSequel proで接続する方法" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img fetchpriority="high" decoding="async" src="https://shungoblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/5411650c615ce76a29cab44447468719.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">DockerのMySQLコンテナにSequel proで接続する方法</div><div class="blogcard-snippet external-blogcard-snippet">docker composeで起動したのMySQLコンテナにSequel proで接続する方法をご紹介します。またSequelを使用せず、コマンドでMySQLコンテナに接続する方法もご説明します。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://shungoblog.com/programming/docker-mysql-sequel-pro.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">shungoblog.com</div></div></div></div></a>
</div><p>The post <a href="https://shungoblog.com/programming/mysql-foreign-key-constraint.html">【MySQL】 外部キー制約 (restrict / cascade / set null)</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/mysql-foreign-key-constraint.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Rails】resourceとresourcesの命名規則</title>
		<link>https://shungoblog.com/programming/rails_resource_resources.html</link>
					<comments>https://shungoblog.com/programming/rails_resource_resources.html#respond</comments>
		
		<dc:creator><![CDATA[しゅんご]]></dc:creator>
		<pubDate>Fri, 30 Sep 2022 11:39:00 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://shungoblog.com/?p=1539</guid>

					<description><![CDATA[<p>目次 はじめに単数形resourceと複数形resourcesの命名規則命名規則一覧Railsガイドよりルーティング一覧 (/rails/info/routes)単数形resource複数形resources はじめに  [&#8230;]</p>
<p>The post <a href="https://shungoblog.com/programming/rails_resource_resources.html">【Rails】resourceとresourcesの命名規則</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">単数形resourceと複数形resourcesの命名規則</a><ol><li><a href="#toc3" tabindex="0">命名規則一覧</a></li><li><a href="#toc4" tabindex="0">Railsガイドより</a></li></ol></li><li><a href="#toc5" tabindex="0">ルーティング一覧 (/rails/info/routes)</a><ol><li><a href="#toc6" tabindex="0">単数形resource</a></li><li><a href="#toc7" tabindex="0">複数形resources</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>railsのルーティングを設定するときに、単数形resourceと複数形resourcesの命名規則にハマったのでまとめてみました。</p>
<p>例として下記のようなroutes.rbで紹介します。</p>
<pre class="highlight"><span class="no"># routes.rb

Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do
  resource :post
  resources :posts
</span>end</pre>
<h2><span id="toc2">単数形resourceと複数形resourcesの命名規則</span></h2>
<h3><span id="toc3">命名規則一覧</span></h3>
<p>それぞれの命名規則を下記の表にまとめました。</p>
<p>太字の部分がresourceとresourcesで異なる部分です。</p>
<div class="scrollable-table"><table style="border-collapse: collapse; width: 100%; height: 205px;">
<tbody>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;"></td>
<td style="width: 16.6667%; height: 41px;">resource</td>
<td style="width: 16.6667%; height: 41px;">resources</td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">routes.rb</td>
<td style="width: 16.6667%; height: 41px;"><strong>resource :post</strong></td>
<td style="width: 16.6667%; height: 41px;"><strong>resources :posts</strong></td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">ファイル名</td>
<td style="width: 16.6667%; height: 41px;">posts_controller.rb</td>
<td style="width: 16.6667%; height: 41px;">posts_controller.rb</td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">コントローラー名</td>
<td style="width: 16.6667%; height: 41px;">PostsController</td>
<td style="width: 16.6667%; height: 41px;">PostsController</td>
</tr>
<tr style="height: 41px;">
<td style="width: 16.6667%; height: 41px;">エンドポイント(GET index)</td>
<td style="width: 16.6667%; height: 41px;"><strong>/post</strong></td>
<td style="width: 16.6667%; height: 41px;"><strong>/posts</strong></td>
</tr>
</tbody>
</table></div>
<p>&nbsp;</p>
<h3><span id="toc4">Railsガイドより</span></h3>
<p>単数形リソースを使用した場合でも、コントローラーは複数形のものに対応付けられるそうです。</p>
<p>これにより、ファイル名やクラス名も複数形になります。</p>
<blockquote><p><span>単数形リソースは複数形のコントローラに対応付けられます。これは、同じコントローラで単数形のルーティング（</span><code>/account</code><span>）と複数形のルーティング（</span><code>/accounts/45</code><span>）を両方使いたい場合を想定しているためです。従って、</span><code>resource :photo</code><span>と</span><code>resources :photos</code><span>のどちらも、単数形ルーティングと複数形ルーティングを両方作成し、同一のコントローラ（</span><code>PhotosController</code><span>）に割り当てられます。</span></p>
<p><a rel="nofollow noopener external" target="_blank" href="https://railsguides.jp/routing.html#%E5%8D%98%E6%95%B0%E5%BD%A2%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9">2.5 単数形リソース</a> (Railsガイド)</p></blockquote>
<p>&nbsp;</p>
<h2><span id="toc5">ルーティング一覧 (/rails/info/routes)</span></h2>
<h3><span id="toc6">単数形resource</span></h3>
<p><img decoding="async" src="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-300x85.png" alt="rails_route_1" width="685" height="194" class="alignnone wp-image-1540" srcset="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-300x85.png 300w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-1024x291.png 1024w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-768x218.png 768w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19-1536x437.png 1536w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.19.png 1920w" sizes="(max-width: 685px) 100vw, 685px" /></p>
<h3><span id="toc7">複数形resources</span></h3>
<p><img loading="lazy" decoding="async" src="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-300x140.png" alt="rails_route_2" width="684" height="319" class="alignnone wp-image-1541" srcset="https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-300x140.png 300w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-1024x476.png 1024w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-768x357.png 768w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31-1536x714.png 1536w, https://shungoblog.com/wp-content/uploads/2022/09/スクリーンショット-2022-09-30-20.18.31.png 1920w" sizes="(max-width: 684px) 100vw, 684px" /></p><p>The post <a href="https://shungoblog.com/programming/rails_resource_resources.html">【Rails】resourceとresourcesの命名規則</a> first appeared on <a href="https://shungoblog.com">shungo blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://shungoblog.com/programming/rails_resource_resources.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
