我有以下型号:
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])
而无需任何其他逻辑。
答案 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。那应该能得到你想要的东西。