7

同じクラスの 2 つの異なる「has_one」属性を含む Rails モデルを作成しようとしています。これを行う簡単な方法があるように感じますが、今は思いつきません。

では、Rails で結婚式のモデルを作成したいとします。

class Wedding < ActiveRecord::Base
  has_one :groom, :class_name => 'Person'
  has_one :bride, :class_name => 'Person'
end


class Person < ActiveRecord::Base
  attr_accessible :wedding_id

  belongs_to :wedding
end

私の目標は、結婚式オブジェクトから新郎オブジェクトにアクセスできるようにすることです。(電話などをすることができます@wedding.groom.name)現在、ウェディングモデルがどの「人」が花嫁でどちらが新郎であるかを知る方法はありません.

単一テーブルの継承を使用する必要がありますか? または、外部キーを使用する必要がありますか?

問題全体を考えるためのより良い方法はありますか?

4

3 に答える 3

9

あなたの関連付けはあなたが望む機能のために後方にあります。

class Wedding < ActiveRecord::Base
  belongs_to :groom, :class_name => 'Person'
  belongs_to :bride, :class_name => 'Person'
end

class Person < ActiveRecord::Base
  has_many :weddings  # who has just one wedding now days???
end

Wedding.find(params[:id]).groom.name

Person.find(params[:id]).weddings.last  # hopefully first also  :)
于 2012-10-12T03:09:43.410 に答える
2

に変更PersonParticipantrole属性を付けます。その後、あなたはすることができます

class Wedding < ActiveRecord::Base
  has_one :groom, :class_name => 'Participant', :condition => "role = 'groom'"
  has_one :bride, :class_name => 'Participant', :condition => "role = 'bride'"
end

(当然、人の代わりに参加者を使用する必要がある技術的な理由はありません。参加者が結婚式で役割を果たし、人がより一般的なものであることが私にはより理にかなっています。たとえば、追加したい場合他の役割では、たとえば仕出し屋の役割を持つ別の参加者と同じ人物である花嫁介添人の役割を持つ参加者がいる場合があります。)

于 2012-10-12T03:07:17.397 に答える
1

ドメイン内での扱いの違いによっては、採用したアプローチに問題がない場合があります。

「花婿」と「花嫁」が一般的に同等に扱われる命名規則である場合は、単にhas_many :parties関係を作成し、Personモデルにどちらが花嫁/花婿であるかを決定させる方が賢明かもしれません。おそらくこのようなもの:

class Wedding < ActiveRecord::Base
  has_many :parties, :class_name => 'Person'

  # helper methods to access bride and groom where specifically needed
  def self.groom
    parties.where(party_type: Person::GROOM).first
  end

  def self.bride
    parties.where(party_type: Person::BRIDE).first
  end
end

class Person < ActiveRecord::Base
  attr_accessible :wedding_id, :party_type

  GROOM = 'Groom'
  BRIDE = 'Bride'

  belongs_to :wedding
end
于 2012-10-12T03:07:32.460 に答える