2013-02-19 18 views
0

我正在爲Catarse項目創建一個Stripe支付引擎。我有三個記錄需要從我的用戶(他是項目所有者)拷貝到我的用戶項目中複製。但是因爲我是初學者,所以代碼看起來像S &%#te!使用.dup與多個記錄

#project_controller.rb 

def create 
    ... 
    check_for_stripe_keys 
    .... 
end 

def show 
    ... 
    check_for_stripe_keys 
    .... 
end 

.... 

def check_for_stripe_keys 
    if @project.stripe_userid.nil? 
    @project.reload 
    @project.stripe_access_token = @project.user.stripe_access_token.dup 
    @project.stripe_key = @project.user.stripe_key.dup 
    @project.stripe_userid = @project.user.stripe_userid.dup 
    elsif @project.stripe_userid != @project.user.userid 
    @project.stripe_access_token = @project.user.stripe_access_token.dup 
    @project.stripe_key = @project.user.stripe_key.dup 
    @project.stripe_userid = @project.user.stripe_userid.dup 
    end 
    @project.save 
end 

.... 

我只需要這三條記錄,因爲我的條紋代碼是一個引擎。三件事:

1)最初我想用戶update_attributes,但我不知道是否有可能在該方法中使用.dup。

2)是否有可能把它放在位於main_app可訪問的引擎中的幫助器上,以便用戶不必編輯main_app project_controller代碼?

3)是否有更清晰的方式顯示上述.dup代碼?因爲它很好看!

感謝您的幫助!

回答

0

這是寫什麼你已經有一個更緊湊的方式:上述

[:stripe_access_token, :stripe_key, :stripe_userid].each do |field| 
    @project.send("#{field.to_s}=", @project.user.send(field).dup) 
end 
+0

漂亮的當然接近完美的朋友......我學到了一些東西關於紅寶石陣列。我覺得哈哈! ;) – lux 2013-02-19 23:22:05

+0

它更關於你可以用send方法 – 2013-02-19 23:39:30

0

也許是這樣的:

的Gemfile:

gem 'deep_cloneable' 

代碼:

@user.dup :include => [:stripe_userid, :stripe_access_token, :stripe_key] 

我不太明白你的人際關係。但是看看這個答案:What is the easiest way to duplicate an activerecord record?

這裏是deep_cloneable: https://github.com/moiristo/deep_cloneable

+0

Thx..my代碼適用於我,但我想看看我是否可以在清潔度較低的路線上做同樣的事情。我會看看deep_cloneable ...從看,它不需要聲明@ user.dup被克隆到的位置(項目) - 只需將其放到我的project_controller或model中即可匹配記錄? – lux 2013-02-19 22:08:45

+0

對,它返回一個尚未提交給數據庫的新記錄。它確實會返回一個相同類型的記錄,所以我不確定它到底是什麼,因爲它看起來像你試圖從用戶複製屬性到項目 – 2013-02-19 22:38:41