7

我正在尝试制作一个包含同一类的两个不同“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

Your associations are backwards for the functionality that you want..

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

更改PersonParticipant,并为其赋予一个role属性。然后你可以做

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

(当然,您需要使用 Participant 而不是 Person 没有技术原因;对我来说,Participant 在婚礼中扮演角色更有意义,而 Person 是更一般的事物。例如,如果您想添加其他角色,您可能有一个扮演伴娘角色的参与者,与另一个扮演餐饮服务者角色的参与者是同一个人。)

于 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 回答