pub struct Via {
pub target: ModelId,
pub expr_ty: Type,
pub cardinality: Cardinality,
pub path: Path,
pub terminal: Option<usize>,
}Expand description
A multi-step relation path.
A Has relation declared with #[has_many(via = a.b)] or
#[has_one(via = a.b)] reaches its
target by following a path of existing relations rather than pairing with a
single BelongsTo. The path is resolved at macro-expansion time — the
derive emits a chained call on the model’s Fields struct
(e.g. User::fields().comments().article()) and converts it into a
stmt::Path, so a misspelled or otherwise unresolvable segment is a
Rust compile error rather than a runtime schema validation failure.
The terminal segment of the path is usually another relation (the via
reaches a model). It may also be a scalar field, in which case the via
projects that field through the relation path — e.g.
#[has_many(via = todos.tags.name)] tag_names: Vec<String> collects the
name of every tag reachable through todos. For a scalar terminal,
terminal holds the terminal field’s index on
target (the model the relation chain reaches), and
path still includes that terminal step as its last element.
Fields§
§target: ModelIdThe ModelId of the model the relation chain reaches. For a relation
terminal this is the associated (target) model; for a scalar terminal
it is the model that owns the projected terminal field.
expr_ty: TypeThe expression type this field evaluates to from the application’s perspective.
cardinality: CardinalityWhether this relation is one-to-many or one-to-one.
path: PathThe resolved field path, rooted at the model that declares the via
relation. When terminal is Some, the last element
of the path is the scalar terminal field (on target)
and the preceding elements form the relation chain.
terminal: Option<usize>For a scalar-terminal via, the index of the projected terminal field on
target. None when the via reaches a model (the
terminal segment is itself a relation).
Implementations§
Source§impl Via
impl Via
Sourcepub fn new(
target: ModelId,
expr_ty: Type,
cardinality: Cardinality,
path: Path,
terminal: Option<usize>,
) -> Self
pub fn new( target: ModelId, expr_ty: Type, cardinality: Cardinality, path: Path, terminal: Option<usize>, ) -> Self
Create a Via from its fully resolved field path.
Sourcepub fn is_scalar(&self) -> bool
pub fn is_scalar(&self) -> bool
Returns true when the via projects a scalar terminal field rather than
reaching a model.