我有两个模型带有" 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()
个语句,并且它们为每一行打印,但只有第一行及其关系保存在我的数据库中。任何人都可以告诉我如何能够转储剩余的行?我怀疑我已经关闭了。
答案 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)