使用.dup和多个记录

时间:2013-02-19 21:33:57

标签: ruby-on-rails

我正在为Catarse项目创建Stripe付款引擎。我需要从我的用户复制三条记录,用户是我的用户项目的项目所有者。但因为我是初学者,代码看起来像S&%#te!

#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代码?因为它太难了!

感谢您的帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是一种更简洁的方式来编写您已有的内容:

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