[前][次][番号順一覧][スレッド一覧]

rails:2939

From: Shin Morichika <ofl@c...>
Date: Sun, 7 Dec 2008 00:22:52 +0900
Subject: [rails:2939] Re: idと同じ数字を同一レコードに保存したい

データベースにはMySQLのLAST_INSERT_ID() ように 
AUTO_INCREMENTの
カラムに挿入された値のうち、最後に自動生成された値を返す関数があ 
ると
いうことで、それが利用できないか調べてみたのですが、

entitiy_idをidと同じ値を取得したいカラムとしますと、

class Man < ActiveRecord::Base

   def save_with_entity_id
     connection.execute("INSERT INTO artists (name,entity_id)
       VALUES(#{connection.quote(self.name)},last_insert_rowid() + 1);")
   end
end
(SQLiteの場合)

とすれば確かにうまくidと同じ値を取得できるのですが、これは 
データベースとの
コネクションに依存するので一度接続が切れると接続直後の 
last_insert_rowid()は
0になったり、データベースとの接続が複数あればidと同じ値を 
保つことは残念ながら
難しいようです。
何か他に確実にAUTO_INCREMENTの値を取得できる方法があれば良 
いのですが。


On 2008/12/06, at 23:42, Andy Matsubara wrote:

> 森近さん
>
> ただ,idは保存しないと決まらないわけですから,そこはどう 
> しようも
> ないですよね?
>
> Andy
>
> 2008/12/06 23:24 Shin Morichika <ofl@c...>:
>> Andyさん
>>
>> 同じようなことをやろうとしている方がいるのは励みになります。
>>
>> 自分も結局after_saveでやることが一番確実かなと思ってい 
>> ます。
>> after_saveでやることのデメリットというか面白くないと感じたの 
>> は、
>> 関連する他のレコードではなく、新規保存したレコード自体を書き 
>> 換える為に
>> 保存直後に再度呼び出すのは効率的でない気がしたのでした。
>>
>> --
>> 森近 真
>> uy4s-mrck@a...
>>
>>
>> On 2008/12/06, at 10:16, Andy Matsubara wrote:
>>
>>> 森近さん
>>>
>>> 私も同じようなことをやろうとしていますが,単純に 
>>> after_saveでいいかと考えていました。
>>> これを使うときのデメリットというのは何か教えていただけますで 
>>> しょうか?
>>>
>>> Andy
>>>
>>> 2008/12/06 8:43 Shin Morichika <ofl@c...>:
>>>>
>>>> あゆかわ様
>>>> わざわざ回答いただきありがとうございます。
>>>>
>>>> おっしゃるように家族の場合は二つのテーブルでの関連モデルで 
>>>> 表すことも
>>>> できると思いますが、実際に作成しているモデルと例としてあげ 
>>>> たユーザー登録は
>>>> 内容も目的も若干異なるため、想定しているものは単純に所有で 
>>>> 表すのは難しいかな
>>>> と思っています。
>>>>
>>>> 実際に作ろうとしているのはユーザー登録というよりも 
>>>> wikiのように誰もが自由に編集
>>>> できるシステムで人物辞典を作るというようなものです。
>>>> 利用者からの入力を許可すれば、たとえ悪意はなくとも一人の人 
>>>> 物が表記の違いや別名
>>>> があったりすることでデータが重複登録されてしまう可能性は高 
>>>> いと思います。
>>>> この場合も本来なら
>>>>
>>>> [人物] → 所有 → [別名]
>>>>
>>>> とすべきと思いますが、そのために厳密なルールで縛ったり、管 
>>>> 理者がデータの登録を
>>>> 監視するのではなく、むしろユーザー登録ほど厳密さは求められ 
>>>> ないので、ファイルの
>>>> エイリアスのようなデータの作成を許すことで別名も独立して登 
>>>> 録しておいた方が好ましい
>>>> 場合や、利用者からの情報登録への敷居を下げたり、後で同じ 
>>>> データをまとめることができる
>>>> 柔軟性のあるシステムが作れないかなと思っています。
>>>>
>>>> もちろん、このような(変な)設計をすることで問題点が生まれ 
>>>> 四苦八苦しているのですが、
>>>> データベースの設計の経験が乏しいのでモデルについてもいろい 
>>>> ろ突っ込んでいただけると
>>>> とてもありがたいです。
>>>>
>>>> --
>>>> 森近 真
>>>> uy4s-mrck@a...
>>>>
>>>>
>>>> On 2008/12/05, at 22:58, AYUkawa, Yasuyuki wrote:
>>>>
>>>>> 森近さま
>>>>>
>>>>> 最近あまり rails に触っていないので、
>>>>> 具体的なコードで提示させていただくことはできないのですが....
>>>>>
>>>>>> ここでid:3のfamily_idを1にすることでid:3
>>>>>> はid:1の家族とみなします。
>>>>>
>>>>> これは「一対多」ということで、
>>>>> テーブルをもう一つ用意されれば、よろしいのではありませんか?
>>>>>
>>>>> つまり....
>>>>>
>>>>> [families] → 所有 → [users]
>>>>> id                   id
>>>>> name                 name
>>>>>                    family_owner(boolean かな?)
>>>>>                    family_id
>>>>>
>>>>> お書きになっていらっしゃる family_id が、
>>>>> 正にその関係を示している、と思います。
>>>>>
>>>>> ちなみに、family_owner は
>>>>> オマケのフラグとして追記してみました。
>>>>>
>>>>>> 1, 山本太郎, 1
>>>>>> 2, 田中直子, 2
>>>>>> 3, 山本陽子,1
>>>>>> 4, 小林実, 4
>>>>>
>>>>> この場合であれば、
>>>>> 旦那さま(勝手に決めていますが笑)の太郎さんには 
>>>>> フラグを立てておいて、
>>>>> 奥様の陽子さんにはフラグを立てなければ、
>>>>> 後で検索する時の目安になるかも知れません。
>>>>>
>>>>> こういう正規化では、ご希望とは相違ありますか?
>>>>> (データベースをスケールさせるための手法であれば、申し訳あ 
>>>>> りません)
>>>>>
>>>>> あゆかわやすゆき
>>>>> http://yamayo.to/diary/
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> ML: rails@r...
>>>> 使い方: http://QuickML.com/
>>>>
>>>
>>> --
>>> ML: rails@r...
>>> 使い方: http://QuickML.com/
>>>
>>
>>
>>
>> --
>> ML: rails@r...
>> 使い方: http://QuickML.com/
>>
>
> --
> ML: rails@r...
> 使い方: http://QuickML.com/
>


--
ML: rails@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

      2930 2008-12-05 01:34 [ofl@c...            ] idと同じ数字を同一レコードに保存したい  
      2932 2008-12-05 14:58 ┗[ayu@y...            ]                                       
      2934 2008-12-06 00:43  ┗[ofl@c...            ]                                     
      2935 2008-12-06 02:16   ┗[andymatsubara@g...  ]                                   
      2937 2008-12-06 15:24    ┗[ofl@c...            ]                                 
      2938 2008-12-06 15:42     ┗[andymatsubara@g...  ]                               
->    2939 2008-12-06 16:22      ┗[ofl@c...            ]