I''m completely stumped by this. Basically, I''ve got an HABTM
self
referential model set up and for some reason the join table is only
saving relationships one way. To illustrate this:
member1 = Member.new
member2 = Member.new
member1.friends[0] = member2
member1.save
member2.friends[0] = member1
member2.save
Both saves return true in the console, but only the first actually is
written to the sqlite join table. I''ve tested a number of more in depth
examples, and in every case, I''m only able to get data saved in one
direction in the join table. For example:
member_id | friend_id
1 2
1 3
2 3
2 1 This won''t save
3 2 This won''t save either
In the console everything shows up correctly if I list .friends for any
object. But after restarting the console, only the uni-directional
entries remain.
Any help would be greatly appreciated! In my project I need to be able
to call .friends on any member and receive all members they are friends
with. Here''s my code:
# Member object
class CreateMembers < ActiveRecord::Migration
def self.up
create_table :members do |t|
t.string :name
t.timestamps
end
end
def self.down
drop_table :members
end
end
# Join table
class CreateMembersFriends < ActiveRecord::Migration
def self.up
create_table :members_friends, :id => false do |t|
t.integer :member_id
t.integer :friend_id
end
end
def self.down
end
end
# Model
class Member < ActiveRecord::Base
has_and_belongs_to_many :friends,
:class_name => "Member",
:join_table => "members_friends",
:foreign_key => "member_id",
:association_foreign_key => "friend_id"
end
--
Posted via http://www.ruby-forum.com/.
Tom Z Meinlschmidt
2009-May-15 22:40 UTC
Re: HABTM Self referential - only saves one way to join table
Bob, in HABTM are table names in alphabetical order, so your table name should be friends_members... tom Bob Mr. wrote:> I''m completely stumped by this. Basically, I''ve got an HABTM self > referential model set up and for some reason the join table is only > saving relationships one way. To illustrate this: > > member1 = Member.new > member2 = Member.new > member1.friends[0] = member2 > member1.save > member2.friends[0] = member1 > member2.save > > Both saves return true in the console, but only the first actually is > written to the sqlite join table. I''ve tested a number of more in depth > examples, and in every case, I''m only able to get data saved in one > direction in the join table. For example: > > member_id | friend_id > 1 2 > 1 3 > 2 3 > 2 1 This won''t save > 3 2 This won''t save either > > > In the console everything shows up correctly if I list .friends for any > object. But after restarting the console, only the uni-directional > entries remain. > > > Any help would be greatly appreciated! In my project I need to be able > to call .friends on any member and receive all members they are friends > with. Here''s my code: > > > > # Member object > class CreateMembers < ActiveRecord::Migration > def self.up > create_table :members do |t| > t.string :name > t.timestamps > end > end > > def self.down > drop_table :members > end > end > > > # Join table > class CreateMembersFriends < ActiveRecord::Migration > def self.up > create_table :members_friends, :id => false do |t| > t.integer :member_id > t.integer :friend_id > end > end > > def self.down > end > end > > > # Model > class Member < ActiveRecord::Base > has_and_belongs_to_many :friends, > :class_name => "Member", > :join_table => "members_friends", > :foreign_key => "member_id", > :association_foreign_key => "friend_id" > end-- ==============================================================================Tomas Meinlschmidt, MS {MCT, MCP+I, MCSE, AER}, NetApp Filer/NetCache - experienced RoR/PHP freelancer, available for hire www.meinlschmidt.com www.maxwellrender.cz www.lightgems.cz ===============================================================================
Bob Mr.
2009-May-16 02:13 UTC
Re: HABTM Self referential - only saves one way to join table
Tom Z Meinlschmidt wrote:> Bob, > > in HABTM are table names in alphabetical order, so your table name > should be friends_members... > > tom > > Bob Mr. wrote: >> >> t.integer :member_id >> class Member < ActiveRecord::Base >> has_and_belongs_to_many :friends, >> :class_name => "Member", >> :join_table => "members_friends", >> :foreign_key => "member_id", >> :association_foreign_key => "friend_id" >> end >Thanks Tom, but unfortunately that doesn''t solve the problem. I need to be able to get the friends of any member. Currently, the join table is only saving it one way. So, for example with the join below, when I try to get member2.friends, the result is nothing. If I try to get member.friends, however, the result is [2, 3]. What I need is to be able to call member2.friends and get the correct result of [1, 3]. Any other ideas? 1 | 2 1 | 3 3 | 2 -- Posted via http://www.ruby-forum.com/.