Сохраняется только одна сторона объединяемой таблицы? - PullRequest
1 голос
/ 18 сентября 2011

В моем приложении объекты пользователя могут следовать друг за другом, и за ними следуют.Эти два отношения различны.

Я вижу, что когда я устанавливаю user_a.follows << user_b, что user_b.followed_by.count все еще == 0. Почему?

Когда я играю в консоли, я вижу:

$ jordan = User.new(:name=>"Jordan")
 => #<User id: nil, name: "Jordan"> 
$ matt = User.new(:name=>"Matt")
 => #<User id: nil, name: "Matt"> 
$ matt.followers << jordan
 => [#<User id: nil, name: "Jordan">] 
$ matt.followers.first
 => #<User id: nil, name: "Jordan"> 
$ jordan.friends.first
 => nil 
$ matt.save

  SQL (14.1ms)  INSERT INTO "users" ("name") VALUES (?)  [["name", "Matt"]] 
  SQL (0.3ms)  INSERT INTO "users" ("name") VALUES (?)  [["name", "Jordan"]]
  SQL (0.4ms)  INSERT INTO "followings" ("followee_id", "follower_id") VALUES (?, ?)  [["followee_id", nil], ["follower_id", 2]]
 => true 

Мои объекты определены как:

class User < ActiveRecord::Base
  has_many  :follower_followee_rel,  
            :class_name         => "Following",
            :foreign_key        => 'followee_id',
            :dependent          => :destroy
  has_many  :friends, 
            :through            => :follower_followee_rel, 
            :source             => :followee
  has_many  :followee_follower_rel,           
            :class_name         => 'Following',
            :foreign_key        => 'follower_id',
            :dependent          => :destroy
  has_many  :followers, 
            :through            => :followee_follower_rel, 
            :source             => :follower
end

class Following < ActiveRecord::Base
  belongs_to  :followee, 
              :class_name         => 'User'
  belongs_to  :follower, 
              :class_name         => 'User'
end

Полное игнорирование второй половины отношения.

Ошибок не возникает.Что происходит?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Отношения объединения не работают, если две объединяемые модели не были сохранены.В третьей строке SQL вы можете видеть, что nil вставляется для followee_id, поскольку у Джордана еще нет идентификатора.

Вам также необходимо сохранить matt, прежде чем проверять друзей Джордана, потому что вы делаете matt.followers << jordan рассматривается как модификация matt, которая не влияет на что-либо еще до тех пор, пока matt не будет сохранен.

1 голос
/ 18 сентября 2011

Реализация Предложение Майкла Фэрли заставило ActiveRecord построить отношения, но отношения все еще определялись неправильно.

Окончательным решением было сохранение записей до их присоединения и исправление внешних ключей, которые были обратными.

Был:

has_many  :follower_followee_rel,  
          :class_name         => 'Following',
          :foreign_key        => 'followee_id',
          :dependent          => :destroy

has_many  :friends, 
          :through            => :follower_followee_rel, 
          :source             => :followee

has_many  :followee_follower_rel,           
          :class_name         => 'Following',
          :foreign_key        => 'follower_id',
          :dependent          => :destroy

has_many  :followers, 
          :through            => :followee_follower_rel, 
          :source             => :follower

Сейчас:

has_many  :follower_followee_rel,  
          :class_name         => 'Following',
          :foreign_key        => 'follower_id',
          :dependent          => :destroy

has_many  :friends, 
          :through            => :follower_followee_rel, 
          :source             => :followee

has_many  :followee_follower_rel,           
          :class_name         => 'Following',
          :foreign_key        => 'followee_id',
          :dependent          => :destroy

has_many  :followers, 
          :through            => :followee_follower_rel, 
          :source             => :follower

Изменение найдено @

:follower_followee_rel, :foreign_key=>'followee_id'
и
:followee_follower_rel, :foreign_key=>'followee_id'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...