Rails通过HABTM将资源ID添加到另一个资源

时间:2011-09-22 17:47:23

标签: ruby-on-rails-3 activerecord

我有3个相关的模型:

class User < ActiveRecord::Base
    has_and_belongs_to_many :groups
end

class Group < ActiveRecord::Base
    has_and_belongs_to_many :users
has_many :galleries
end

class Gallery < ActiveRecord::Base
    belongs_to :group
end

我希望能够在组内创建用户和图库,以便只有作为该组成员的用户才能查看属于该组的图库。我还希望用户能够查看他们所属的其他组的画廊(因此是HABTM协会)。

我很难概念化它如何与控制器一起工作,也许我在考虑问题。如果我创建一个组,然后我去创建一个用户,那么将当前group_id添加到用户模型的最佳方法是什么?画廊模型也是如此......

这有意义吗?

如果我需要澄清或添加代码示例,请告诉我。

非常感谢你的帮助。

编辑:澄清 我在最初的问题中肯定没有任何意义,但在朋友的帮助下,我确实找到了答案。

我最终做的是通过params哈希将group_id传递给表单,如下所示:

<%= link_to "Add User", new_admin_user_path(:group_id => @group.id) %>
<%= link_to "Add Gallery", new_gallery_path(:group_id => @group.id) %>

然后在表单中使用隐藏字段,将group_id分配给“group_id”隐藏字段:

<%= hidden_field_tag :group_id, params[:group_id] %>

最后,在我的创建方法中,在保存之前添加这些行完美地分配了group_id:

# Gallery only has one group
@gallery.group_id = params[:group_id]
# Users can belong to many groups
@user.groups << Group.find(params[:group_id])

我仍然需要坐下来围绕你们提供的答案。非常感谢您抽出宝贵时间帮助我。对此,我真的非常感激。

2 个答案:

答案 0 :(得分:0)

当您使用控制器中的find方法时,您可以这样做:

Gallery.find :all, :joins => "INNER JOIN groups ON groups.gallery_id = galleries.id INNER JOIN users ON users.group_id = groups.id", :conditions => "users.id = #{@your_current_user_id}"

必须找到用户所属的所有组的图库。

答案 1 :(得分:0)

我希望在Sebes建议的控制器中定义它,而是在User模型中。

调整他的想法:

def galleries
  Gallery.joins(:groups => :users).where("users.id = ?", self.id)
end

然后获取current_user对象的库的集合:

current_user.galleries