2012-03-14 95 views
1

在我的Rails應用程序中,我有用戶。用戶被要求提供他們的家鄉城市和地區/社區。Rails:按特定順序創建屬性

class User < ActiveRecord::Base 
    belongs_to :city 
    belongs_to :district 
end 

class City < ActiveRecord::Base 
    has_many :users 
    has_many :districts 
end 

class District < ActiveRecord::Base 
    has_many :users 
    belongs_to :city 
end 

在形式我建立使用接受字符串(下面的情況下,它的相關詳細信息)上的用戶模型中的虛擬屬性的關聯。

在控制檯中,這一切都很好,但在UI中不起作用。問題似乎是,我可以通過一個形式獲得city_name沒問題,但是當我嘗試以相同的形式分配城市和地區時,它總是失敗。換句話說,批量分配不起作用。

@user.update_attributes(params[:user]) 

相反,我已經能夠找出的唯一事情就是手動設置從表單提交每個鍵,如:

@user.name = params[:user][:name] if params[:user][:name] 
@user.city_name = params[:user][:city_name] if params[:user][:city_name] 
@user.district_name = params[:user][:district_name] if params[:user][:district_name] 

這種方法的工作原理,但它是一個痛苦,那種脆,並且感覺全部錯誤,因爲它開始用很多邏輯來控制控制器。

我的問題是:

  1. 有沒有一種方法來創建或更新以特定的順序屬性,最好的模式,使控制器不擔心這一切?

  2. 我做錯了嗎?如果是這樣,哪種方法會更好。


額外的資訊

下面是如何建立使用用戶模型的虛擬屬性的關聯,如果這是有關任何潛在的回答者:

我希望用戶能夠通過輸入一個名字來選擇一個城市,例如「Chicago,IL」。這工作得很好,在使用像這樣的用戶模型虛擬屬性:

def city_name 
    city.try :full_name 
end 

def city_name=(string) 
    self.city = City.find_or_create_by_location_string(string) 
end 

很有道理的用戶找到或創造從他們所選擇的城市區。此作品略有不同:

def district_name 
    district.try :name 
end 

def district_name=(string) 
    if self.city.nil? 
    raise "Cannot assign a district without first assigning a city." 
    else 
    self.district = self.city.districts.find_or_create_by_name(string) 
    end 
end 

在這些東西做工精細的模型層,如預期只要雙方一CITY_NAME和district_name設置區協會工作。

回答

1

我認爲你可以做一些事情來清理這件事。首先,您可以使用代理來清理代碼。例如

delegate :name, :to => :city, :prefix => true, :allow_nil => true 

這樣,你可以這樣做

user = User.create 
user.city_name # nil 
city = City.create(:name => 'chicago') 
user.city = city 
user.save 
user.city_name # chicago 

,這將只是工作。

接下來,我會說從你的模型中取出名稱到ID的邏輯。您可以以表格形式(例如ajax搜索將地區ID /城市ID放入隱藏字段中)或控制器中。然後,像平常一樣分配城市/地區。

+0

這是一個好主意。我能夠根據爲ID使用隱藏字段的想法重新設置我的設置,而不是將字符串傳遞給模型,這使得它更簡單。感謝你的建議,你讓我走上了正軌。 – Andrew 2012-03-19 02:48:29