Rails 5.1,模型和数据库关系,与用户组共享数据

时间:2018-02-01 10:21:05

标签: ruby-on-rails model foreign-keys relational-database ruby-on-rails-5

对不起标题我真的不知道要放在那里要非常清楚。所以我的解释清楚。

用户可以通过表单创建群组和链接。用户可以通过会员加入群组,其中会员在表格中有group_iduser_id。我希望能够在组内共享用户链接 因此,当用户创建组时,其他用户将加入此组。目前,当用户创建链接时,它仅适用于自己,但我希望用户能够与他所属的群组共享(或不共享)他创建的链接。如果用户是多个组的成员,则用户可以选择他想要共享他创建的链接的组。

我有4个模型:Link.rbUser.rbMember.rbGroup.rb。这是我的关系:

#Link.rb:

    class Link < ApplicationRecord
        belongs_to :user
    end  

#User.rb :

    class User < ApplicationRecord
      has_many :links, dependent: :destroy
      has_many :members, :dependent => :destroy
      has_many :groups, :through => :members
    end  

#Member.rb :

    class Member < ApplicationRecord
      belongs_to :user
      belongs_to :group

      validates :user_id, :presence => true
      validates :group_id, :presence => true
      validates :user_id, :uniqueness => {:scope => [:user_id, :group_id]}
    end

#Group.rb :

    class Group < ApplicationRecord
    has_secure_token :auth_token

        has_many :members, :dependent => :destroy
        has_many :users, through: :members, source: :user
        belongs_to :owner, class_name: "User"


        def to_param
            auth_token
        end

    end

我尝试了什么:
我在链接表中添加了group_id的引用。并在belong_to :group中添加了link.rb,在has_many :links, dependent: :destroy中添加了group.rb

在我的新链接表单中,我在select中添加了current_user group_id(仅检索用户所在的组),并在创建时使用group_id和current_user id创建链接。这有效。
问题是我必须输入group_id,这意味着我不给用户任何选择,他必须给出group_id所以基本上他必须共享该组的链接。这不是我想要的。

我的想法:
也许我应该像我对成员那样采取同样的想法。这意味着有一个像grouplinks这样的新表,我给group_id,link_id和user_id提供了关系,所以我可以使用grouplink.id在我的组中共享。这是一个不错的选择吗?如果是的话我应该采取什么样的关系?任何其他建议,也许我完全错了,有一些容易做的事情,我没有看到它。

我会尝试使用我想到的一些代码:

#Link.rb:

    class Link < ApplicationRecord
        belongs_to :user
        belongs_to :grouplink
    end  

#User.rb :

    class User < ApplicationRecord
      has_many :links, dependent: :destroy
      has_many :grouplinks, dependent: :destroy
      has_many :members, :dependent => :destroy
      has_many :groups, :through => :members
    end  

#Grouplink.rb :

    class Member < ApplicationRecord
      belongs_to :user
      belongs_to :group
      belongs_to :link
    end

#Group.rb :

    class Group < ApplicationRecord
    has_secure_token :auth_token

        has_many :members, :dependent => :destroy
        has_many :users, through: :members, source: :user
        belongs_to :owner, class_name: "User"
        has_many :groupslinks, :dependent => :destroy
        has_many :links, through: :grouplinks


        def to_param
            auth_token
        end

    end

可以解决这个问题吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

最好使用group_id和link_id创建连接表。由于组管理员是创建组的用户,因此您甚至不需要添加user_id(我认为是member_id),因为该组的每个成员都可以访问该链接。获取用户组并将该链接添加到该特定组并检查关联。

class GroupLink belongs_to :group belongs_to :link 你可以做到

@group = @user.groups.find(params[:group_id]) @group_link = @group.group_links.build(link_id: link_id) @group_link.save

如果您需要其他任何内容或澄清这一点,请告诉我。