2011-07-21 35 views
1

有什么方法可以访问在“.build”上创建的“has_many,:through =>”关联的连接模型?
我很抱歉,我没有在这里实际的代码,但我希望你明白我想要什么;)使用has_many访问.build上的连接模型,通过

a: 
has_many :bs 
has_many :cs, :through => :bs 

B和C正确定义(W/belongs_to的,的has_many,的has_many通)
现在:在控制器我试图做一个

var = @a.cs.build 

(内交易,但我不认为这是与此有关),其“创造”一个C实例,也是加盟湾但是我怎样才能访问自动创建的b,因为我想传递一些属性?那是不可能的,或者我必须解决与

@a.create_c 
# or 
varb = B.new 
varb.someattr1 = "foo" # <- this is what I want w/ .build 
varb.someattr2 = "bar" 
varb.a = @a 
varc = C.new 
varc.someattr3 = "asdf" 
varb.c = varc 
# ... and some .save! 

或某事像吗?我不认为这是很好的风格,也不会因为某种原因'打破'包装交易
我真希望你能得到我想要的。


编辑

UMH,首先:您的回答,谢谢,但我仍然坚持。 我会尝试更精确:

@a = A.new 
@a.name = "foo" 
varc = @a.cs.build 
varc.name = "bar" 
@a.save! 

这是要给我A,B和C.我如何设置为B属性的一个实例?
某事如:

varb = join_model_of(@a, varc) 
varb.name = "foobar" 

之前的@ a.save!

TYIA!

回答

0

解决方案:

varb = @a.bs.build 
varc = varb.build_c 
varb.someattr1 = "foo" 
varb.someattr2 = "bar" 
varc.someattr3 = "sadf" 
@a.save! 

[BUT: (没有上花了很多的思考 “为什么”) 我的B类不包括:

validates_presence_of :a # <- problem! 
validates_presence_of :c 

我不能让过去第一个(上述)验证。我必须将其注释掉,但它会写入数据库(正确)。 ]

至少这个工程。但我不能100%确定这是否应该这样做。请注意!

0

当你

var = @a.cs.build 

它实际上给你bs对象,这样你就可以访问bs对象使用VAR的属性。
你可以自己试试。

0

我很困惑一点关于你的问题,但我知道,鉴于Model01,JoinModel和Model02你应该有这样的访问器:

model1.model2s 
model1.model2_ids 
model1.join_models 
model1.join_model_ids 

这最后两会给你什么,我想你在问......如果我错了,你能解释一下,像我这样的白痴能理解吗?

谢谢!

相关问题