我正在尝试创建一个包含同一类的两个不同“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
或其他什么)目前婚礼模型无法知道哪个“人”是新娘,哪个是新郎。
我应该使用单表无效吗?或者我应该使用外键吗?
有没有更好的方法来考虑整个问题?
答案 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