2012-05-10 53 views
0

的Rails 3.1 attr_accessible屬性的動態數組,紅寶石1.9.2Ruby on Rails的 - >元編程 - 創建基於的has_many關係

我試圖適應Railscasts集345(HSTORE)到我建立一個應用程序 - 這個問題不是以HSTORE爲中心的......因爲如果我正在序列化屬性散列,我也會遇到它。

這裏是我有一個問題的代碼:

Class Product < ActiveRecord::Base 

has_many :properties 

%w[author rating runtime].each do |key| # *****--> PLEASE SEE BELOW! 
    attr_accessible key 
    scope "has_#{key}", lambda { |value| where("properties @> (? => ?)", key, value) } 

    define_method(key) do 
    properties && properties[key] 
    end 

    define_method("#{key}=") do |value| 
    self.properties = (properties || {}).merge(key => value) 
    end 
end 

*現在,這裏的扭曲。產品類具有許多管理員在創建時分配的屬性。這是在一個名爲Property的連接模型中完成的。

因此,我不想搜索一個名爲Property的has_many模型,而是使用屬性id的集合來填充數組。

我試圖與

self.properties.collect{ |property| "property_#{property.id}" }.each do |key| 

,但不工作的更換的%聲明數組W [作者等級運行] !!我在屬性關係上得到了一個未定義的方法錯誤(我認爲這是因爲模型沒有實例化?)我對編程相當陌生,對元編程一無所知。

編輯 - 我一直在努力,所有這一切都移入after_find掛鉤,這不工作,要麼(與其他幾十個不成功的嘗試沿),所以輸了...

任何幫助是很大的不勝感激!

+0

方法屬性僅適用於產品實例。 你想完全替代@ product.properties的語義嗎? (即消除has_many:屬性),還是你想保持正常的語義,並以某種方式補充它? – RadBrad

+0

感謝您的答覆 - 我想保持正常的語義(因爲我想仍然能夠查詢@ product.properties),但添加到他們。例如,如果產品1只有屬性作者和評級分配,我想保留此實例的可訪問屬性列表中的運行時屬性。另一方面,如果產品具有通過連接分配的所有屬性,我希望所有屬性都可以訪問...... –

回答

0

好吧,經過幾天的黑客攻擊,我想我終於明白了這一點。

關於這種解決方案的'聲音'的任何和所有小齒輪,非常感謝!

總之,所有我是包上面的代碼塊(帶有%符號開始)到一個方法,如下所示:

def dynamic_accessible_and_setters(*details) 
    details.each do |key| # I placed the details variable here instead of the %w[] 
    attr_accessible key 
    scope "has_#{key}", lambda { |value| where("properties @> (? => ?)", key, value) } 

    define_method(key) do 
     properties && properties[key] 
    end 

    define_method("#{key}=") do |value| 
     self.properties = (properties || {}).merge(key => value) 
    end 
    end 
end 

然後,在控制器中,我只叫從該方法類和分配的屬性的數組:

def edit 
    PRODUCT.dynamic_accessible_and_setters("author", "rating", "runtime") 
    ... 
end 

,現在我有動態構建的getter,setter和attr_accessible,自定義爲類的每個實例(或,所以,我認爲?)

我希望這可以幫助別人!現在看看多個數據庫寫入與序列化和一次寫入的性能權衡。