gpt4 book ai didi

ruby-on-rails - Rails模型关系,有多少,属于多少?

转载 作者:行者123 更新时间:2023-12-02 05:20:02 24 4
gpt4 key购买 nike

我有以下结构:

class User < ActiveRecord::Base
end

class Item < ActiveRecord::Base
end

class Group < ActiveRecord::Base
end

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

我应该如何建立关系?

最佳答案

好吧,您会遇到一些问题,因为您需要在这里建立双重多对多关系。 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]

现在,这会设置您想要的关系,但您还必须编写自己的 Controller / View 逻辑来限制访问,或者使用像 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 associations 而不是 HABTM。

祝你好运!

关于ruby-on-rails - Rails模型关系,有多少,属于多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14014179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com