Mor*_*ger 7 ruby activerecord ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2
我有三个类:人员,职位和目录.
我希望能够做的是每次我将一个人添加到Directory.people集合时,将数据添加到连接模型,例如标题字段.通常的<<运营商不会削减它.Id est:
directory = Directory.last # Let's assume that retrieves a Directory object
person = Person.last # Let's assume that retrieves a Person object
directory.people << person
Run Code Online (Sandbox Code Playgroud)
这会将人员添加到Directory对象的people集合中,但不允许我有机会将数据分配给连接模型.因此,在对该网站进行了大量研究后,我发现了另一种方法将Person添加到people集合中,并将数据添加到链接Person和Directory的Position,id:
directory = Directory.last # Let's assume that retrieves a Directory object
person = Person.last # Let's assume that retrieves a Person object
position = person.positions.build(:directory_id => directory.id, :title => "Administrative Assistant")
position.save
Run Code Online (Sandbox Code Playgroud)
这很麻烦.同样繁琐的方式是:
directory = Directory.last # Let's assume that retrieves a Directory object
person = Person.last # Let's assume that retrieves a Person object
position = Position.new(directory_id: directory.id, person_id: person.id, title: "Administrative Assistant")
Run Code Online (Sandbox Code Playgroud)
再次,似乎是错误的,因为我希望能够强调Person和Directory之间的关系,我相信这是使用has_many的原因:通过适当的.
我希望能够做的是使用<<运算符,并传递其他数据,例如:
directory = Directory.last # Let's assume that retrieves a Directory object
person = Person.last # Let's assume that retrieves a Person object
directory.people << person, :position => {:title => "Administrative Assistant"}
Run Code Online (Sandbox Code Playgroud)
我在has_many中重载了<<运算符:通过声明,如下所示:
has_many :people, :through => :positions do
def << *args
arg = args.first
if arg.is_a?(Person)
self.push([arg])
elsif arg.is_a?(Hash)
# Don't know what to do in here (see below)
else
raise "Invalid Value" # There's a better error to raise here, but good enough for now.
end
end
end
Run Code Online (Sandbox Code Playgroud)
获得这个工作的好处是它在语法上很好地工作,并允许我简洁地将数据分配给连接对象(位置),同时将Person添加到Directory对象的people集合.
但我无法使其工作,因为我需要能够访问<<运算符左侧的人员集合属性的Directory对象,以便构建一个位置并将其保存到数据库中.
所以,我的问题是:
非常感谢您的帮助和深思熟虑的回复.我已经在这半天被黑客攻击无济于事.
回答 感谢回答这个问题的PinnyM,我能够提出这个实现:
module AddToPeopleAndPositionExtension
def << *args
arg = args.first
if arg.is_a?(Person)
self.push([arg])
return self
elsif arg.is_a?(Hash)
directory = proxy_association.owner
person = arg[:person]
position = person.positions.build(:directory_id => directory.id, :title => arg[:position][:title])
position.save
else
raise "Invalid Value"
end
end
end
class Directory < ActiveRecord::Base
# Relationships
has_many :positions
has_many :people, :through => :positions, :extend => AddToPeopleAndPositionExtension
end
Run Code Online (Sandbox Code Playgroud)
如果我不关心连接模型上发生了什么,这允许我以标准方式调用<<运算符,例如:
directory = Directory.last # Let's assume that retrieves a Directory object
person = Person.last # Let's assume that retrieves a Person object
directory.people << person
Run Code Online (Sandbox Code Playgroud)
而且,我也可以通过指定连接模型的属性来调用它,如:
directory = Directory.last # Let's assume that retrieves a Directory object
person = Person.last # Let's assume that retrieves a Person object
directory.people << {:person => person, :position => {:title => "Administrative Assistant"}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |