1

次のテーブル関係のモデルに関連付けを実装する最良の方法は何ですか?

現在の内容・目的

  • これはレガシー データベースであるため、テーブル構造を同じに保ちます。
  • Userとそれらprimary addressを一度に保存するオプションが必要です。
  • usersテーブルには、primaryaddressidを指す列がありますuser_addressesaddressidテーブル。
  • user_addressesuseridテーブルにはを指すの外部キーがありますusersuserid

これが私がこれまでに持っているものです。

# User model class associations
has_many :user_addresses, :foreign_key => "userid", :autosave => true
belongs_to :primary_address, :class_name => "UserAddress", :foreign_key => "primaryaddressid", :autosave => true

そして、オプションで、次のようなプライマリアドレスでユーザーを作成できるようにしたいと思います...

User.new
User.primary_address.build(:street => 'dfkslf', :street2 => 'dfjkslfjlks231', etc)
User.save

これにより、レコードが保存され、User テーブルの primaryaddressid が自動的に更新されます。

質問...

私の主なオプションは、値がafter_saveあるかどうかを検証する を作成し、そうでない場合は、指定されて挿入された最新のアドレスをprimaryaddressid探し、をユーザーに追加して更新することだと考えています。user_addressesuseridaddressid

この状況を処理して、ユーザーを追加し、パフォーマンスへの影響を最小限に抑えながら、最大限の柔軟性を実現する最善の方法は何ですか?

4

1 に答える 1

1

だから私はやや満足している私の解決策を見つけました。

私のUserAddressモデルでは、次を追加しました。

attr_writer :is_primary
attr_reader :is_primary

after_save :update_primaryid

def set_as_primary!
  self.is_primary = true
end

def update_primaryid
  if self.is_primary
     user = User.find_by_personid(self.personid)
     user.primaryaddressid = self.addressid
     user.save!
  end
end

これにより、次のことを自由に行うことができます。

useraddress = user.user_addresses.build(personAddr)
useraddress.set_as_primary!

user.save!
于 2013-03-14T16:21:26.473 に答える