Skip to content

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.

ruby
field :admin, as: :has_one
Has one

Options

searchable

Turns the attach field/modal from a select input to a searchable experience

ruby
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.

ruby
# 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

ruby
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.

ruby
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:
    • :new - Enables nesting in the new view.
    • :edit - Enables nesting in the edit view.
    • :forms - Enables nesting in the new and edit views.
  • limit: (Only for has_many and has_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

ruby
# 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