如何在使用acts_as_tenant gem保存“tenant”类之前构建关联记录?

时间:2013-06-19 16:25:14

标签: ruby-on-rails ruby associations model-associations acts-as-tenant

示例...

我有一个名为client的班级,这是我的tenant型号 我有相关记录与要创建的每个新client一起保存。 我们称他们为tasks 我在after_initialize内部创建了client回调,该回调调用了一个名为build_defaults的方法,该方法执行以下操作...

def build_defaults
self.tasks.build(
  Task.new({
    :name => 'task 1',
    :description => 'task 1 desc',
    :view_module => 'task_1_template'
  }),
  Task.new({
    :name => 'task 2',
    :description => 'task 2 desc',
    :view_module => 'task_2_template'
  }),
  Task.new({
    :name => 'task 3',
    :description => 'task 3 desc',
    :view_module => 'task_3_template'
  }),
  Task.new({
    :name => 'task 4',
    :description => 'task 4 desc',
    :view_module => 'task_4_template'
  }),
  Task.new({
    :name => 'task 5',
    :description => 'task 5 desc',
    :view_module => 'task_5_template'
  })
)
end

task课程设置为acts_as_tenant :client

当我去@client = new Client( :name => "Test Client" )时 它引发了ActsAsTenant::Errors::NoTenantSet: ActsAsTenant::Errors::NoTenantSet

有什么方法可以有条件地绕过acts_as_tenant的检查,当它是new_record时?或者更好的方法来处理这类事情?

几个月前我对rails / ruby​​很新......?

更新

好吧,我想出是否将其更改为“after_create”并在方法中设置ActsAsTenant.current_tenant = self我可以self.tasks.create!调用...但不确定是否重写ActsAsTenant.current_tenant是好的想法?

  after_create :build_defaults
  def build_defaults
    ActsAsTenant.current_tenant = self
    self.tasks.create!({
      :name => 'Facebook > Page Like',
      :description => 'Request that they like your page.',
      :view_module => 'facebook_page_like'
    })
    self.tasks.create!({
      :name => 'Facebook > Share',
      :description => 'Share a link on Facebook',
      :view_module => 'facebook_share_link'
    })
    self.tasks.create!({
      :name => 'Twitter > Tweet',
      :description => 'Post a tweet on a user behalf.',
      :view_module => 'twitter_tweet'
    })
    self.tasks.create!({
      :name => 'Twitter > Follow',
      :description => 'Follow the company twitter user.',
      :view_module => 'twitter_follow'
    })
    self.tasks.create!({
      :name => 'Giveaway Share',
      :description => 'This allows you to earn 5 extra entries by re-sharing this giveaway.',
      :view_module => 'giveaway_share'
    })
  end

1 个答案:

答案 0 :(得分:2)

如果您创建新租户,然后想要创建与新客户关联的多个记录,则首先需要设置当前租户,否则acts_as_tenant将不允许您这样做。

你的方法有效,但acts_as_tenant也有一个特定的API(也请看看我):

设置块的当前租户

ActsAsTenant.with_tenant(newly_created_tenant) do
  # Current tenant is set for all code in this block
end

这很有效。

但是,如果您想在创建帐户后让新租户直接访问其应用。你最好登录他然后创建默认值。如何登录他取决于您的身份验证解决方案。