Следуя вашему примеру классов A, B & C и меняя только реализацию класса A.
class A
belongs_to :b
def cs
self.id = b_id
b_cast = self.becomes(B)
b_cast.cs
end
end
Консоль
A.first ==>#<A id: 105, b_id: 1 ...>
B.first ==>#<B id: 1 ...>
C.all ==>#<C id: 1, b_id: 1 ...>,
#<C id: 2, b_id: 1 ...>,
#<C id: 3, b_id: 1 ...>,
#<C id: 4, b_id: 1 ...>
A.first.cs
A Load (0.2ms) SELECT "as".* FROM "as" ORDER BY "as"."id" ASC LIMIT ? [["LIMIT", 1]]
C Load (0.1ms) SELECT "cs".* FROM "cs" WHERE "cs"."b_id" = ? LIMIT ? [["b_id", 1], ["LIMIT", 11]]
A.first.cs ==>#<C id: 1, b_id: 1 ...>,
#<C id: 2, b_id: 1 ...>,
#<C id: 3, b_id: 1 ...>,
#<C id: 4, b_id: 1 ...>
Официальная # стать (класс) документация может бытьнайдено здесь !
С другой стороны, того же эффекта можно добиться, создав экземпляр класса B и присвоив ему идентификатор, сохраненный в A.first.b_id, следующим образом:
B.new(id: A.first.b_id).cs
A Load (0.2ms) SELECT "as".* FROM "as" ORDER BY "as"."id" ASC LIMIT ? [["LIMIT", 1]]
C Load (0.1ms) SELECT "cs".* FROM "cs" WHERE "cs"."b_id" = ? LIMIT ? [["b_id", 1], ["LIMIT", 11]]
B.new(id: A.first.b_id).cs ==>#<C id: 1, b_id: 1 ...>,
#<C id: 2, b_id: 1 ...>,
#<C id: 3, b_id: 1 ...>,
#<C id: 4, b_id: 1 ...>