Rails通过两个连接表进行HABTM关联

时间:2010-10-28 09:07:08

标签: ruby-on-rails associations has-and-belongs-to-many

我有以下型号:

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => :friend_id
  has_and_belongs_to_many :friend_groups
end

class FriendGroup < ActiveRecord::Base
  has_and_belongs_to_many :friendships
end

如何声明FriendGroup has_and_belongs_to_many :friends through :friendships

我希望FriendGroup.friend_ids,所以在表单中我可以设置一个字段'friend_group[friend_ids][]',只需调用FriendGroup.create(params[:friend_group])而无需任何其他逻辑。

3 个答案:

答案 0 :(得分:0)

类FriendGroup&lt;的ActiveRecord :: Base的       has_and_belongs_to_many:friends,:through =&gt; :friendgroups     端

答案 1 :(得分:0)

好吧,我发现不是单线,而是两线解决方案看起来很优雅:

class FriendGroup < ActiveRecord::Base
...
  attr_accessor :friend_ids
  before_create {|fg| fg.friendships = Friendship.find_all_by_user_id_and_friend_id(fg.user_id, fg.friend_ids)}

答案 2 :(得分:0)

我对你想和FriendGroups做些什么感到困惑。

您的基本友谊被建模为:

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User"
end

class User < ActiveRecord::Base
  has_many :friendships
  has_many :friends, :through => :friendships
end

您是否希望在传入的所有用户之间大量创建友谊记录?这可能是某种排列问题。不是你需要另一种模型的东西。也许像友谊这样的类方法,如interconnect(user_ids)

如果你想找到彼此都是朋友的用户群,听起来你正在进入图论和连接。

修改

如果FriendGroups只是附有姓名的朋友的通用容器,我会做这样的事情:

class User < ActiveRecord::Base
  has_many :friend_groupings
  has_many :friend_groups
  has_many :friendships
  has_many :friends, :through => :friendships
end

class FriendGrouping < ActiveRecord::Base
  belongs_to :friend_group
  belongs_to :friend
end

class FriendGroup < ActiveRecord::Base
  has_many :friend_groupings
  has_many :friends, :class_name => "User", :through => :friend_groupings
  belongs_to :user

  validates_presence_of :name # Name of FriendGroup
end

我可能会在用户下面嵌入FriendGroups,并为FriendGroups设置FriendGroups accept_nested_attributes_for。我会在FriendGroup控制器中执行此操作,并且在FriendGroup的视图中允许用户设置组的名称,然后为他们的每个朋友提供复选框以放入组中。对于他们选择的每个朋友,在FriendGroup和User之间创建一个新的FriendGrouping。那应该能得到你想要的东西。