使用hmt关系批量插入新模型实例

时间:2017-11-15 05:31:13

标签: ruby-on-rails postgresql csv activerecord

我有两个模型带有" has_many,通过"这些定义所定义的关系:

class TabAccount < ApplicationRecord
  has_many :tab_community_accounts
  has_many :tab_communities, through: :tab_community_accounts
end

class TabCommunity < ApplicationRecord
  has_many :tab_community_accounts
  has_many :tab_accounts, through: :tab_community_accounts
end

class TabCommunityAccount < ApplicationRecord
  belongs_to :tab_community
  belongs_to :tab_account
end

我想在创建新社区后从CSV文件批量添加新帐户。这不会产生错误:

_upload_dir = <string>
_import_filename = <string>
_community_name = <string>
_this_community = TabCommunity.find_by_name(_community_name)

File.foreach("#{_upload_dir}/#{_import_filename}") do |csv_row_raw|
  csv_row = csv_row_raw.split(",")
  _screen_name = csv_row[0].strip
  _this_community.tab_accounts.first_or_create!({screen_name: _screen_name, ref_platform_id: RefPlatform.find_by_name("Twitter").id})
end

但它只会为CSV文件中的第一行插入新帐户和hmt关系。我想使用.first_or_create(),因为该帐户可能已存在于数据库中。我在put之前和之后foreach内添加了.first_or_create()个语句,并且它们为每一行打印,但只有第一行及其关系保存在我的数据库中。任何人都可以告诉我如何能够转储剩余的行?我怀疑我已经关闭了。

1 个答案:

答案 0 :(得分:1)

您可以使用find_or_create_by!模型本身上的TabAccount确认帐户是否已存在或创建,并将其分配回TabCommunity关系,如下所示:

acc = TabAccount.find_or_create_by!(
  screen_name: _screen_name, 
  ref_platform_id: RefPlatform.find_by_name("Twitter").id
)
_this_community.tab_accounts << acc unless _this_community.tab_accounts.include?(acc)