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

rails:1416

From: Keiji Yoshimi <walf443@g...>
Date: Fri, 28 Jul 2006 08:31:42 +0900
Subject: [rails:1416] Re: 同一テーブルを参照する2つの外部キーの設定

よしみと申します。

アソシエーションは自分も苦手なのですが
まだ誰も反応がないようなので反応してみます。
(間違っていることも多々あると思いますが、その際はご指摘いただけると助かります

> とあるいくつかの支店を持つ店があり、店内販売の顧客と、通信販売の
> 顧客を抱えているとして、それらを表現するために2つのテーブルを扱
> っています。
> 1つは顧客を表すテーブルで、それぞれid、name属性をもってます。こ
> れは、店内販売の顧客、通信販売の顧客も同じ顧客としてまとめていま
> す。本来は店内顧客テーブル、通信販売顧客テーブルと分けてしまうの
> が一番簡単なのですが・・・それが難しく。
Migrationだと
class CreateKokyakus < ActiveRecord::Migration
  def self.up
    create_table :kokyakus do |t|
      t.column :name, :string
    end
  end
  def self.down
    drop_table :kokyakus
  end
end
ということでよろしいでしょうか?
> もう1つはお店そのものを表すテーブルで、店内販売用の顧客ID、通信
> 販売用の顧客IDを同一の「顧客テーブル」への外部キーとして持ってい
> ます。
こちらは、  
class CreateStores < ActiveRecord::Migration
  def self.up
    create_table :stores do |t|
      t.column :tenpo_kokyaku_id, :integer
      t.column :tuushin_kokyaku_id, :integer
    end
  end
  
  def self.down
    drop_table :stores
  end
end
こんな感じでしょうか?

> 使用する際は、ある一つの支店IDが定まったら、店内顧客リスト一覧、
> 通信販売顧客一覧と2つ表示したいのです。

> 今のところは、find_by_sqlを使って直接sqlを書いているのですが、一
> つのテーブルを参照するキーが一つの時のように、もう少しスマートに
> (店舗.find(1).顧客sみたいな感じで)書く方法はないでしょうか?
一応、前提のテーブルの構造に従って定義すると、
class Kokyaku < ActiveRecord::Base
  has_many :stores
end

class Store < ActiveRecord::Base
  belongs_to :tenpo_kokyaku, :class_name => "Kokyaku"
  belongs_to :tuushin_kokyaku, :class_name => "Kokyaku"
end
のように定義するのが普通なのかなと思います。

ただ店舗 has_many 顧客であり、顧客 belongs_to 店舗であるのが
店舗のIDから店内顧客リスト一覧を得るのには普通なのかなと思います。

class Store < ActiveRecord::Base
  has_many :tenpo_kokyakus, :class_name => "Kokyaku"
  has_many :tuushin_kokyakus, :class_name => "Kokyaku"
end

なら
store.tenpo_kokyakus #=> []
store.tuushin_kokyakus #=> []
と一覧を得ることが出来ます。

ただ顧客側がstore_idを持ってないとbelongs_to側が上手く定義できない気がします。


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

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

->    1416 2006-07-28 01:31 [walf443@g...        ] Re: 同一テーブルを参照する2つの外部キーの設定
      1417 2006-07-28 03:32 ┗[yuichi_katahira@m...]                                       
      1425 2006-07-29 03:21  ┗[insight.insight@g...]