模型初始化和关系

时间:2016-05-19 17:26:12

标签: ruby-on-rails

如果我的模型具有两级关系,accepts_nested_attributes_for

Company has_many addresses
Address有许多address_types

因此,如果我初始化Company,我认为它还会创建AddressAddressType吗?

    @company = Company.new 
    @company.address.size #this should be 1?
    @company.address.address_type.size #this should be 1?

问题:如何初始化地址,以及带有默认属性的address_type,即current_user_id

所以对于控制器中的公司,我可以写:

@company.current_user_id = current_user.id

但模型中无法访问current_user。有没有办法用current_user初始化所有东西,而不仅仅是公司?什么是最好的解决方法?

我们可以这样做:

@company.address.new(current_user)

OR

在Address和AddressType模型的before_save回调中,我可以使用:

before_save: set_user

def set_user
  self.current_user_id = self.company.current_user.id
end

1 个答案:

答案 0 :(得分:1)

不,当你初始化模型时,它将以一个空数组开头,所以:

@company = Company.new 
@company.address.size #this is 0
@company.address.address_type.size #this is 0

默认情况下,您无法初始化这些值,您需要在创建公司时发送这些值。

Controller应该告诉模型实例

使用数据库是模型的工作。处理Web请求(包括了解当前请求的用户)是控制器的工作。

因此,如果模型实例需要知道当前用户,控制器应该告诉它。

def create
  @item = Item.new
  @item.current_user = current_user # or whatever your controller method is
  ...
end

这假定Item具有current_user的attr_accessor。

更新

您可以循环资源,在控制器中添加私有方法:

def assign_current_user_to_address_type(company)
  company.addresses.each do |address|
    address.address_types.each do |address_type|
      address_type.create_user_id = current_user.id
    end
  end

end