Rails模型包含单个“has_one”模型的多个实例

时间:2012-10-12 02:58:56

标签: ruby-on-rails activerecord

我正在尝试创建一个包含同一类的两个不同“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或其他什么)目前婚礼模型无法知道哪个“人”是新娘,哪个是新郎。

我应该使用单表无效吗?或者我应该使用外键吗?

有没有更好的方法来考虑整个问题?

3 个答案:

答案 0 :(得分:8)

您的关联是您想要的功能的后退..

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  :)

答案 1 :(得分:2)

Person更改为Participant,并为其指定role属性。然后就可以了

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

(当然没有技术上的理由你需要使用参与者而不是人;对我来说,参与者在婚礼中扮演一个角色更有意义,而一个人是更普遍的事情。例如,如果你想要添加其他角色,你可能有一个参与者扮演伴娘角色,与另一个参与者相同的角色,比如caterer。)

答案 2 :(得分: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