如果我的模型具有两级关系,accepts_nested_attributes_for
:
Company
has_many addresses
Address
有许多address_types
因此,如果我初始化Company
,我认为它还会创建Address
和AddressType
吗?
@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
答案 0 :(得分:1)
不,当你初始化模型时,它将以一个空数组开头,所以:
@company = Company.new
@company.address.size #this is 0
@company.address.address_type.size #this is 0
默认情况下,您无法初始化这些值,您需要在创建公司时发送这些值。
使用数据库是模型的工作。处理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