ActiveRecord Associations(has_one) - Access parent object

rails has_one association example
rails polymorphic association
rails has_one vs belongs_to
rails has_one :through
rails has_one optional
rails has_one scope
rails has_many foreign key
rails associations tutorial
class Parent < ApplicationRecord
  has_one: child
end


class Child < ApplicationRecord
  belongs_to :parent
end


childrens = Child.includes(:parent)

puts childrens.to_json
[{"id":1,"parent_id":1,"name":"Jack"},{"id":2,"parent_id":2,"name":"Oleg"}]

In this case, we can access parent object like this: child.parent

But it is not possible to access parent object in view. Is there any way to include parent objects in each child?

Thank you!

You can use as_json with the include option to get each child parent:

Child.includes(:parent).as_json(include: :parent)

For that you get a couple of queries. One for the children, the other one for each children parents (IN clause):

Child Load (1.0ms)  SELECT "children".* FROM "children"
Parent Load (1.2ms)  SELECT "parents".* FROM "parents" WHERE "parents"."id" IN ($1, $2)  [["id", 1], ["id", 2]]

You can limit the columns you're retrieving from the database (with select) as well as each object in the JSON object (that doesn't apply a SQL filter).

ActiveRecord Associations(has_one), This is not a bug, just a question about ActiveRecord Associations. This is my code. class Parent < ApplicationRecord has_one: child end class� If the parent object (the one declaring the has_one association) is unsaved (that is, new_record? returns true) then the child objects are not saved. They will automatically when the parent object is saved. If you want to assign an object to a has_one association without saving the object, use the build_association method.

There is a bit of confusion which you made with includes. This will not include the objects, but prepares them in case they are needed.

Because you have an association between Parent and Child, you can already get the parents in view, but this will request the parent for every children hence you'll run in n+1 queries.

To put it in code:

Child.all.each { |c| c.parent }; nil

will trigger:

Parent Load (0.2ms)  SELECT  "parents".* FROM "parents" WHERE "parents"."id" = $1 LIMIT 1   [["id", 4750516]]
Parent Load (0.2ms)  SELECT  "parents".* FROM "parents" WHERE "parents"."id" = $1 LIMIT 1   [["id", 4772539]]
Parent Load (0.1ms)  SELECT  "parents".* FROM "parents" WHERE "parents"."id" = $1 LIMIT 1   [["id", 4806512]]

What you do there with includes, will make it look like:

SELECT "children".* FROM "children"
Parent Load (3.3ms)  SELECT "parents".* FROM "parents" WHERE "parents"."id" IN (4750516, 4772539, 4806512)

So, if you want to use it in the view, you'll actually have something like @childrens so don't be afraid to iterate over and call .parent.

You can read more about eager loading here

ActiveRecord::Associations::ClassMethods, Assigning an object to a belongs_to association does not save the object, since the foreign key field belongs on the parent. It does not� About ActiveRecord Associations. Basic associations consist of has_one, has_many, and belongs_to. These associations are primarily used to get collections of objects like a user’s posts or

Child.includes(:parent).as_json(include: :parent)

This helped me!

Active Record Associations — Ruby on Rails Guides, How to understand the various types of Active Record associations. If the parent object (the one declaring the has_one association) is unsaved (that is, lazily meaning that the database is queried only when the object(s) are accessed . Specifies the name of the belongs_to association on the associated object that is the inverse of this has_one association. See ActiveRecord::Associations::ClassMethods's overview on Bi-directional associations for more detail.:required When set to true, the association will also have its presence validated. This will validate the association

has_one (ActiveRecord::Associations::ClassMethods), See also ActiveRecord::Associations::ClassMethods's overview on when to use record or customize the generated query when you access the associated object. object or destroy it if marked for destruction, when saving the parent object. So, in this case, I get a pointer to the Chore object but no access to any of its attributes. I could certainly just add Chore as another column in my user table, but I may add to that model in the future + I just want to figure out how the has_one association works anyway. Any help is appreciated!

ActiveRecord::Associations::ClassMethods, class Project < ActiveRecord::Base belongs_to :portfolio has_one one), in order to update their primary keys - except if the parent object is unsaved ( new_record? The proxy objects that control the access to associations can be extended� # When set to +true+, validates new objects added to association when saving the parent object. +false+ by default. # If you want to ensure associated objects are revalidated on every update, use +validates_associated+.

Rails models cheatsheet, Polymorphic associations. class Post has_many :attachments, as: :parent end. class Image belongs_to :parent, polymorphic: true end. And in migrations: Specifies a one-to-one association with another class. This method shouldonly be used if this class contains the foreign key. If the other classcontains the foreign key, then you should use #has_oneinstead. See also ActiveRecord::Associations::ClassMethods’soverview on when to use #has_oneand when to use #belongs_to.

Comments