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...]