I am writing a chat-roulette on RoR, I created a Clients table with a field partner_id. Model code:

class Client < ActiveRecord::Base belongs_to :partner, :class_name => 'Client' has_one :partner, :class_name => 'Client', :foreign_key => 'partner_id' end 

How to do that when assigning client.partner = other_client clients exchange links, and not just it was assigned to one? I understand the deletion events to process before_destroy to clear the partner_id from the partner?

Are there any other ways to create such dependencies?

  • one
    You have two connections, belongs_to and has_one, are called the same: partner - it’s better not to do so. - cheops
  • I understand in this case, one of the links should be called inverse_partner? - srghma
  • one
    Yes, it is better to rename, otherwise glitches are provided to you. - cheops

2 answers 2

Alternatively, overload the partner= method

 def partner=(client) super # TODO: выдать исключение, если client == self client.partner_id = self.id client.save end 
  • I do not quite understand, but I need to write self.partner_id = client.id instead of client.partner_id = self.id , as I understand it, this is because partner= is called for the value to be assigned - srghma
 class Client < ActiveRecord::Base belongs_to :inverse_partner, :class_name => 'Client', :foreign_key => 'partner_id' has_one :partner, :class_name => 'Client', :foreign_key => 'partner_id' before_destroy :unsubscribe_partner def partner=(client) existing_partner = self.partner puts ">>>> BEFORE".red log ">>>> SELF:", self log ">>>> SELF.PARTNER:", existing_partner if existing_partner log ">>>> CLIENT:", client raise ArgumentError.new("Partner can't be self") if client == self super puts ">>>> AFTER SUPER".red log ">>>> SELF:", self log ">>>> SELF.PARTNER:", existing_partner if existing_partner log ">>>> CLIENT:", client self.partner_id = client.id puts ">>>> AT END".red log ">>>> SELF:", self log ">>>> SELF.PARTNER:", existing_partner if existing_partner log ">>>> CLIENT:", client end private def unsubscribe_partner self.partner_id = nil end def log (prompt, table) print prompt print "id = ", "#{table.id}".red, ", " print "partner_id = ", "#{table.partner_id}".red, "\n" end end