WARNING
It's important to set the inverse_of
as often as possible to your model's association attribute.
Has One
The HasOne
association shows the unfolded view of your has_one
association. It's like peaking on the Show
view of that associated record. The user can also access the Attach
and Detach
buttons.
field :admin, as: :has_one

Options
-> searchable
Turns the attach field/modal from a select
input to a searchable experience
class Avo::Resources::CourseLink < Avo::BaseResource
def fields
field :links,
as: :has_many,
searchable: true
end
end
WARNING
Avo uses the search feature behind the scenes, so make sure the target resource has the search_query
option configured.
# app/avo/resources/course_link.rb
class Avo::Resources::CourseLink < Avo::BaseResource
self.search = {
query: -> {
query.ransack(id_eq: params[:q], link_cont: params[:q], m: "or").result(distinct: false)
}
}
end
Default
false
Possible values
true
, false
-> attach_scope
Scope out the records the user sees on the Attach modal.
Default
nil
Possible values
field :user,
as: :belongs_to,
attach_scope: -> { query.non_admins }
Pass in a block where you attach scopes to the query
object and parent
object, which is the actual record where you want to assign the association. The block is executed in the ExecutionContext
.
WARNING
The attach_scope
will not filter the records in the listing from has_many
or has_and_belongs_to_many
associations. Use scope
or a Pundit policy Scope
for that.
field :members,
as: :has_one,
attach_scope: -> { query.where.not(team_id: parent.id) }
In this example, in the attach_scope
, we ensure that when attaching members to a team, only those who are not already members will appear in the list of options.
Show on edit screens
By default, the has_one
field is only visible in the show view. To make it available in the edit view as well, include the show_on: :edit
option. This ensures that the has_one
show view component is also rendered within the edit view.
Nested in Forms
You can use "Show on edit screens" to make the has_one
field available in the edit view. However, this will render it using the show view component.
To enable nested creation for the has_one
field, allowing it to be created and / or edited alongside its parent record within the same form, use the nested
option which is a hash with configurable option.
Keep in mind that this will display the field’s resource as it appears in the edit view.
-> nested
Enables this field as a nested form in the specified views.
Default value
{}
Possible values
A hash with the following options:
on:
Views in which to enable nesting. Accepted values:limit:
(Only forhas_many
andhas_and_belongs_to_many
fields) Hides the "Add" button when the specified limit is reached.
TIP
Setting nested: true
is a shortcut for nested: { on: :forms }
.
Example
# app/avo/resources/book.rb
class Avo::Resources::Book < Avo::BaseResource
def fields
# Shortcut for full nesting
field :author, as: :has_one, nested: true
# Explicit nesting on new only
field :author, as: :has_one, nested: { on: :new }
# Explicit nesting on edit only
field :author, as: :has_one, nested: { on: :edit }
# Explicit nesting on both new and edit
field :author, as: :has_one, nested: { on: :forms }
# Limit nested creation (for has_many or has_and_belongs_to_many only)
field :authors,
as: :has_one,
nested: { on: [:new, :edit], limit: 2 }
end
end