Activerecord: Schaffen Sie eine Eins-zu-Viele-Beziehung zurück zu sich selbst
-
18-09-2019 - |
Frage
Ich erstelle eine Website für soziale Netzwerke. Ich habe eine Tabelle von Benutzern. Jeder Benutzer kann eine Reihe anderer Benutzer als Freunde haben, daher habe ich eine zweite Tabelle Freunde:
user_id
friend_id
Basierend auf dieser Antwort versuche ich, die Beziehungen zu schaffen. Ich habe,
class User < ActiveRecord::Base
has_many :friends, :dependent => :destroy
has_many :users, :through => :friends
has_many :source_friend, :class_name => "Friend", :foreign_key => "friend_id", :dependent => :destroy
has_many :source_users, :class_name => "User", :through => :friend_id
...
und
class Friend < ActiveRecord::Base
belongs_to :user
belongs_to :source_friend, :class_name => "User", :foreign_key => "friend_id"
end
Wenn ich versuche, die Tabellen damit aus meiner Ansicht zu verwenden:
<% @user.users.each do |friend| %>
<% if friend.status == User::ACTIVE %>
<p>
<%= link_to h(friend.name), :controller => "user", :id => h(friend.name)%>
</p>
<% end %>
<% end %>
Die zurückgegebenen Namen sind immer die des Quellbenutzers und nicht der Zielfreund.
Lösung
Okay, ich habe es gelöst: Ändern Sie den zweiten Eintrag unter dem Benutzer in:
has_many :users, :through => :friends, :source => :source_friend
Ich bin mir immer noch nicht sicher, ob der Code in der Frage einen unnötigen Crud drin hat?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow