Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://rubyonrails2006.blog63.fc2.com/tb.php/16-ce7187ae

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

has_one について:効率的に作成/消去しましょう。

has_one によって、データベースを一対一にマップすることができます。
が、一対一にマップするだけであって、それらの作成/削除を自動で連携してくれる
わけではないみたいです。

モデル内にいくつかの行を挿入すると、これらの連携ができて便利です。

例: 以下の2つのテーブルがあったとします。
mysql> describe users;
+----------+--------------+------+-----+-------------------+----------------+
| Field    | Type         | Null | Key | Default           | Extra          |
+----------+--------------+------+-----+-------------------+----------------+
| id       | int(11)      | NO   | PRI |                   | auto_increment |
| login    | varchar(225) | NO   |     |                   |                |
| password | varchar(225) | NO   |     |                   |                |
| updated  | timestamp    | YES  |     | CURRENT_TIMESTAMP |                |
+----------+--------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)


mysql> describe profiles;
+---------+--------------+------+-----+-------------------+----------------+
| Field   | Type         | Null | Key | Default           | Extra          |
+---------+--------------+------+-----+-------------------+----------------+
| id      | int(11)      | NO   | PRI |                   | auto_increment |
| email   | varchar(225) | NO   |     |                   |                |
| blog    | text         | NO   |     |                   |                |
| picture | text         | NO   |     |                   |                |
| user_id | int(11)      | NO   |     | 0                 |                |
| updated | timestamp    | YES  |     | CURRENT_TIMESTAMP |                |
+---------+--------------+------+-----+-------------------+----------------+
6 rows in set (0.00 sec)

usersはLoginGeneratorにて必要となる基本テーブル、profilesは
そのテーブルに入りきらない情報を追加しています。


userに対して、profilesを追加する際は、

model/profiles.rb には
  belongs_to :user 
model/user.rbには
  has_one :profile

を追加するというのが流儀ですが、ここで、user.rbには、上記の代わりに
  has_one :profile
  before_destroy :delete_profile
  def delete_profile
    self.profile.destroy
  end
と追加すると、user.rbにて削除される際に、profileも同時に削除されます。

追加の際のことも考えると、
  has_one :profile
  before_create :create_profile
  before_destroy :delete_profile
  def create_profile
    profile = Profile.new
    self.profile = profile
  end
  def delete_profile
    self.profile.destroy
  end

とすればOKです。

※ただし、トランザクションの一貫性に関しては疑問が残ります。。




補足:

※注釈:

before_create と brefore_destroy がキモです。
例えば、before_create は 新規にデータベースにInsertする直前に
呼び出されるものです。

brefore_create :create_profile

で、データベースにInsertする直前に create_profileというメソッドを
呼び出しています。

メソッド create_profileは
  def create_profile
    profile = Profile.new
    self.profile = profile
  end

です。

要するに、「Proflieを新しく作って、それをUserにくっつけて。」といっています。

スポンサーサイト
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://rubyonrails2006.blog63.fc2.com/tb.php/16-ce7187ae

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。