嵌套资源有很多:通过关系问题

时间:2012-04-07 00:53:04

标签: ruby-on-rails has-many-through nested-attributes

我真的陷入了这个问题,我找不到从中出来的方法:

我有一个用户模型(用设计构建)。

我有一个项目模型,它是用户的嵌套资源。

在用户模型(user.rb)中:

# Setup the relations model
has_many :items, :dependent => :destroy

在项目模型(item.rb)中:

# Setup the relations model
belong_to :user
在routes.rb中

resources :users do
  resources :items
end

通过这种方式,用户可以创建项目并拥有它:

路径:user / 1 / items / 1

现在我希望用户能够与另一个用户共享一个项目(由他创建),但持有该项目的所有权(只是创建该项目的用户可以销毁它,而只是用户那个创建项目可以更新项目的某些字段,而其他字段也需要由用户接收项目进行更新(可编辑)。 换句话说,我希望项目的权限对于创建它的用户和刚收到它的用户是不同的。

为了允许用户之间的项目共享操作,我构建了以下as_many:通过关系:

我创建了另一个模型,称为共享(表示项目模型和用户模型之间的联合表):

然后我按以下方式修改了user.rb(用户模型):

# Setup the Item relations model
has_many :items, :dependent => :destroy # this to set up the item ownership

#This to set up the has_many :through realtionship
#(note I am calling a new model shared_items - that really doesn't exist - is an item model)
has_many :sharings
has_many :shared_items, :foreign_key => "shared_user_id", :through => :sharings

accepts_nested_attributes_for :items #This will work for the nested items resource
accepts_nested_attributes_for :sharings #Do I really need this line??

# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, 
                :items_attributes, #This will work for the nested items resource
                :sharings_attributes  #Do I really need this line??

然后我按以下方式修改了item.rb(项目模型):

# Setup the relations model
belong_to :user

#this two lines are suppose to connect the two models (item and receiver) using a joint table
has_many :sharings
has_many :shared_users, :foreign_key => "shared_item_id", :through => :sharings

accepts_nested_attributes_for :sharings #Do I really need this line??

attr_accessible :user_id, :item_type, :reference_date, :title, 
                :sharings_attributes #Do I really need this line??

我用以下方式编写了sharing.rb(共享模型 - 联合表):

belongs_to :shared_user, :class_name => "User"
belongs_to :shared_item, :class_name => "Item"

attr_accessible :shared_moment_id, :shared_user_id

之后,我不得不考虑这样一个事实,即接收者也是一个用户(是一个自我参考关系),而在我的应用程序中,仍然存在友谊模型(允许用户与其他用户交朋友)这就像魅力一样 - 但我相信Joel的建议可以帮助(或者只是改变对我朋友表的引用)。

有了这个,我可以为Item(ItemsController)创建一个restful控制器,并添加一个new,create,show,destroy等动作,允许用户(实际上是current_user)创建一个项目,销毁或更新它没有任何问题。 (正如您在项目模型中看到的那样,有外键user_id)。

我需要做什么,以便创建一个安静的控制器来管理共享模型(创建新的共享项目,并与其他用户分配它们(共享它们))???

我怎样才能回忆起数据库值?我的意思是,例如:

身份3的用户创建了五个新项目(项目编号为1,2,3,4,5),现在他还决定与其他用户共享此项目(项目2与用户6,项目4,5与用户7,8,9)???

我拿出嵌套资源进行分享,现在我只有:

item是用户的嵌套资源(user / 2 / item / 5) 分享会是什么?

请有人帮助我....

非常感谢 Dinuz

更新 我能够让应用程序正常工作,但仅作为单件:

用户创建项目。在他决定与另一个用户共享项目(并使用sharings控制器 - 联合表控制器后,我能够在联合表内创建记录(传递用户ID和特定于项目ID)。

现在我想改为执行所有操作:

current_user(登录的用户)创建了一个项目,他需要以相同的形式拥有与其他用户(数组)共享的机会,或者只为自己保留。

我相信这个进一步的步骤需要将项目控制器和共享控制器融合在一起,并在新的项目视图中执行相同的操作。

那我该怎么办呢?如果有人可以为has_many建议一个很好的教程:通过这可以涵盖我的情况(我真的需要了解在这种情况下控制器和视图将如何),我认为模型关联设置得很好,但我无法弄清楚如何继续控制器和视图。

1 个答案:

答案 0 :(得分:1)

您可以使用以下自定义验证:

class User < ActiveRecord::Base
  validate :sharing_with_friends_only

  def sharing_with_friends_only
    (receivers - friends).empty?
  end
end

正如您所提到的,简单的方法是取消嵌套资源。

这也将使您的API更清洁。