【问题标题】:Rails model relationship, has many and belongs to many?Rails 模型关系,有很多和属于很多吗?
【发布时间】:2012-12-23 19:49:32
【问题描述】:

我有以下结构:

class User < ActiveRecord::Base
end

class Item < ActiveRecord::Base
end

class Group < ActiveRecord::Base
end

User 可以创建(并因此拥有)Group
GroupItems 的列表和可以访问这些项目的Users 的列表。 换句话说,用户拥有Items 的列表,并且可以通过Group 成员资格控制哪些Users 可以看到这些项目。

我应该如何建立关系?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model


    【解决方案1】:

    好吧,你会遇到一些问题,因为你想要一个双多对多关系。 IE。组拥有并属于许多项目,项目拥有并属于许多用户。

    所以,我会以这种方式设置关系,假设您希望一个组能够拥有许多项目,并且项目可能属于多个组:

    User has_many :groups
    User has_and_belongs_to_many :items
    User has_many :own_items, :class_name => 'Item'
    
    Group belongs_to :user
    Group has_and_belongs_to_many :items
    
    Item has_and_belongs_to_many :groups
    Item has_and_belongs_to_many :users
    Item belongs_to :owner, :class_name => 'User'
    

    您的迁移需要如下所示:

    # Group
    :user_id, :integer
    
    # Item
    :owner_id, :integer
    
    # GroupsItems
    :group_id
    :item_id
    
    #ItemsUsers
    :item_id
    :user_id
    

    现在,您正在查看的结构并不是世界上最干净的,但只要您注意用户关联,它就会按照您的预期运行。

    例如,创建一个用户的项目:

    @user = User.first
    @user.own_items.create(...)
    

    分配用户能够查看项目...

    @item = Item.find(...) #or @user.own_items.find(...)
    @item.users = [user1,user2,user3]
    

    现在,这设置了您想要的关系,但您还必须编写自己的控制器/视图逻辑来限制访问,或者使用像 CanCan 这样的库。

    例如:

    # View
    - if @item.users.include?(current_user)
      ...show item... 
    
    # Items Controller:
    def show
      @item = Item.find(params[:id])
      if @item.users.include?(current_user)
        ...continue...
      else
        redirect_to :back, :alert => 'You are not authorized to view this item.'
      end
    end
    

    我希望这些示例能够为您指明正确的方向。您将有许多与访问控制相关的问题需要处理,但尝试思考它们并解决我能想到的每一个问题超出了这个问题的范围。

    另外,请注意,这是我能想到的最简单的设置。如果您在关联中有更复杂的逻辑,您可能希望创建一个成熟的连接模型并使用 has_many :through 关联而不是 HABTM。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多