有没有办法访问“has_many,:through =>”的连接模型在“.build”上创建的关联?
对不起,我这里没有实际的代码,但我希望你能理解我想要的东西;)
a:
has_many :bs
has_many :cs, :through => :bs
b和c被正确定义(w / belongs_to,has_many,has_many-through)
现在:在控制器中,我正在尝试做一个
var = @a.cs.build
(在一个交易中,但我认为这里不相关),它“创建”了一个c实例,也加入了b。但是我如何访问自动创建的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!
是吗?还是那样的?我不认为这是非常好的风格,也不会因某种原因“打破”包装交易
我希望你得到我想要的东西。
修改
嗯,首先:谢谢你的答案,但我仍然被卡住了。 我会尝试更精确:@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"
之前的
!
TYIA!
答案 0 :(得分:0)
当你这样做时
var = @a.cs.build
它实际上为您提供了bs
对象,因此您可以使用var来访问bs
对象的属性。
你可以亲自试试。
答案 1 :(得分:0)
我对你的问题感到困惑,但我确实知道给定Model01,JoinModel和Model02你应该有这样的访问器:
model1.model2s
model1.model2_ids
model1.join_models
model1.join_model_ids
最后两个会给你我想要的你要求的东西......如果我错了,你能解释一下像我这样的白痴能理解吗?
谢谢!
答案 2 :(得分:0)
解决方案:
varb = @a.bs.build
varc = varb.build_c
varb.someattr1 = "foo"
varb.someattr2 = "bar"
varc.someattr3 = "sadf"
@a.save!
[但是: (没有花太多时间思考“为什么”) 我的B班确实包括:
validates_presence_of :a # <- problem!
validates_presence_of :c
我无法超越第一个(上述)验证。我必须对它进行评论,然后将其写入数据库(正确)。 ]
至少这是有效的。然而,我不是百分之百确定这是否是你应该这样做的方式。请使用Cmt!