Доступ к модели соединения в .build с помощью has_many:: through - PullRequest
1 голос
/ 21 июля 2011

Есть ли способ получить доступ к модели соединения ассоциации "has_many,: through =>", созданной в ".build"?
Мне жаль, что у меня нет действительного кода здесь, но я надеюсь, что вы понимаете, что я хочу;)

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

b и c определены правильно (w / assign_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! 

или что-то подобное? Я не думаю, что это очень хороший стиль, и по какой-то причине он не «нарушает» транзакцию обертывания
Я очень надеюсь, что вы получите то, что я хочу.


EDIT

Хм, прежде всего: спасибо за ваши ответы, но я все еще застрял. Я постараюсь быть более точным:

@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!

Ответы [ 3 ]

0 голосов
/ 21 июля 2011

Я немного озадачен вашим вопросом, но я знаю, что с учетом Model01, JoinModel и Model02 у вас должны быть такие средства доступа, как это:

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

Эти последние два дадут вам то, о чем я думаю вы просите ... если я ошибаюсь, вы можете объяснить, чтобы такой идиот, как я, мог понять?

спасибо!

0 голосов
/ 25 июля 2011

Решение:

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

[НО: (не особо задумываясь над «почему») Мой класс В включает:

validates_presence_of :a # <- problem!
validates_presence_of :c

Я не могу получитьпосле первой (из вышеперечисленных) проверки.Я должен это закомментировать, но он записывается в БД (правильно).]

По крайней мере, это работает.Тем не менее, я не уверен на 100%, так ли вы должны это делать.Pls Cmt!

0 голосов
/ 21 июля 2011

Когда вы делаете

var = @a.cs.build

, это фактически дает вам объект bs, и вы можете получить доступ к атрибутам bs объекта, используя var.
Вы можете попробовать это сами.

...