class Agents << ActiveRecord::Base belongs_to :customer belongs_to :house end class Customer << ActiveRecord::Base has_many :agents has_many :houses, through: :agents end class House << ActiveRecord::Base has_many :agents has_many :customers, through: :agents end
How do I add to the Agents
model for Customer
?
Is this the best way?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
The above works fine from the console however, I don't know how to achieve this in the actual application.
Imagine a form is filled for the customer that also takes house_id
as input. Then do I do the following in my controller?
def create @customer = Customer.new(params[:customer]) @customer.agents.create(customer_id: @customer.id, house_id: params[:house_id]) @customer.save end
Overall I'm confused as to how to add records in the has_many :through
table?
They essentially do the same thing, the only difference is what side of the relationship you are on. If a User has a Profile , then in the User class you'd have has_one :profile and in the Profile class you'd have belongs_to :user .
In Ruby on Rails, a polymorphic association is an Active Record association that can connect a model to multiple other models. For example, we can use a single association to connect the Review model with the Event and Restaurant models, allowing us to connect a review with either an event or a restaurant.
Self-referential association means we create a JOIN MODEL, such as Friendship, for example, which links another model, such as User to itself, so a user can have many friends (which are other users), and a friend can be befriended by a user ( a follower and a followed).
Stories can belong to many categories. Categories can have many stories. has_many :through gives you a third model which can be used to store various other pieces of information which don't belong to either of the original models. Person can subscribe to many magazines.
I think you can simply do this:
@cust = Customer.new(params[:customer]) @cust.houses << House.find(params[:house_id])
Or when creating a new house for a customer:
@cust = Customer.new(params[:customer]) @cust.houses.create(params[:house])
You can also add via ids:
@cust.house_ids << House.find(params[:house_id])
'The best way' depends on your needs and what feels most comfortable. Confusion comes from differences ActiveRecord's behavior of the new
and create
methods and the <<
operator.
new
Methodnew
will not add an association record for you. You have to build the House
and Agent
records yourself:
house = @cust.houses.new(params[:house]) house.save agent = Agent(customer_id: @cust.id, house_id: house.id) agent.save
Note that @cust.houses.new
and House.new
are effectively the same because you need to create the Agent
record in both cases.
<<
OperatorAs Mischa mentions, you can also use the <<
operator on the collection. This will only build the Agent
model for you, you must build the House
model:
house = House.create(params[:house]) @cust.houses << house agent = @cust.houses.find(house.id)
create
Methodcreate
will build both House
and Agent
records for you, but you will need to find the Agent
model if you intend to return that to your view or api:
house = @cust.houses.create(params[:house]) agent = @cust.agents.where(house: house.id).first
As a final note, if you want exceptions to be raised when creating house
use the bang operators instead (e.g. new!
and create!
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With