2

我建立以下模型功能的应用如何为具有两个belongs_to关系的模型建立关联?

  • 组有许多用户
  • 组有很多费用(每次费用有:姓名,:总共:added_by_user_id场)
  • 费用有很多奥因斯(1用于组中的每个用户)
  • 奥因斯具有:量和:USER_ID,哪个用户由于所指

到目前为止参考,我含有S等组成模型作为如下:

# user.rb 
class User < ActiveRecord::Base 
    attr_accessible :first_name, :last_name, :email, :password 
    has_many :memberships, :foreign_key => "member_id", :dependent => :destroy 
    has_many :groups, :through => :memberships 
    has_many :owings 
end 

# group.rb 
class Group < ActiveRecord::Base 
    attr_accessible :name 
    has_many :memberships, :dependent => :destroy 
    has_many :members, :through => :memberships 
    has_many :expenses 
end 

# expense.rb 
class Expense < ActiveRecord::Base 
    attr_accessible :total_dollars, :name, :owings_attributes, :added_by_user_id  
    belongs_to :group, :inverse_of => :expense 
    has_many :owings, :dependent => :destroy 
end 

# owing.rb 
class Owing < ActiveRecord::Base 
    attr_accessible :amount_dollars, :user_id 

    belongs_to :expense, :inverse_of => :owings 
    belongs_to :user, :inverse_of => :owings 
end 

# NB - have left off memberships class (and some attributes) for simplicity 

要创建费用,我使用@ group.expenses.build(PARAMS [:费用]),其中PARAMS来自包括用于属性的嵌套模型形式需要创建的欠款。这些参数包括用于该费用的每个“欠款”实例的'user_id'。

我有两个顾虑: - (我认为)

  • 首先,我做了“USER_ID”在奥因斯模型访问,这意味着恶意用户可以改变谁在牺牲欠什么。不过,我不知道如何解决这个问题,因为用户在填写费用/欠款表格时需要查看该组所有其他成员的姓名。其次 - 我还在费用模型中提供了'added_by_user_id' - 我也不希望恶意用户能够更改它,因为此user_id具有特殊的编辑/删除费用。是否有一些聪明的方法可以让一个用户和一个组成为“belongs_to”,并在创建时设置这两个关联而不必创建可访问的属性?如果有帮助,可以将“added_by_user_id”始终设置为current_user。

任何想法?很可能我在这里错过了一些相当基础的东西。

在此先感谢!

PS。长时间的听众,第一次来电。感谢你们所有人为我教育红宝石轨道迄今;这个网站是一个不可思议的资源!

回答

2

你有没有想过动态设置它们?

dynamic attr-accessible railscast

+0

感谢您的快速答复 - 有趣railscast,我不熟悉动态ATTR访问的。但我认为这不会对我有帮助 - 我可以在控制器中使用before_filter来阻止未经授权的用户编辑/删除费用。但我仍然需要保留:added_by_user_id(在费用中)和:user_id(在欠款中),因为它们最初是从params中分配的。我想没有办法解决这个问题,因为没有办法从参数中删除它们。最好的办法是进行真正全面的验证,以防止某些事情发生。 – 2011-03-13 09:09:34

+0

我想我已经来到这里登陆了。对于第一个问题,user_id必须可以访问。用户需要能够说出每个用户欠多少钱。我将确保用户在被允许更新/编辑之前通过授权测试,并且无论授权用户设置的是合法的。对于第二个问题,我在模型中设置了一个归因设置方法(def set_user(user)) - 这意味着我可以将它从'attr_accessor'中删除,因此无法通过质量分配进行设置。尽管谢谢你的回答。你教的是一些东西,所以我会接受你的答案。干杯。 – 2011-03-16 01:05:15

相关问题