Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails在分配ID时更新布尔属性_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails在分配ID时更新布尔属性

Ruby on rails Rails在分配ID时更新布尔属性,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有很多关联。我也有一些在同一个模型上有许多关联依赖于布尔值。当我可以选择一种关联类型的ID时,我还有一个多重选择。我需要得到一个代码:当我将ID分配给布尔值==true的关联时,所有其他ID都应该变成false 请考虑以下例子: class Dealer < AR::Base has_many :campaigns has_many :published_campaigns, class_name: 'Campaign', -> { where(published: tru

我有很多关联。我也有一些
在同一个模型上有许多
关联依赖于布尔值。当我可以选择一种关联类型的ID时,我还有一个多重选择。我需要得到一个代码:当我将ID分配给布尔值==true的关联时,所有其他ID都应该变成false

请考虑以下例子:

class Dealer < AR::Base
  has_many :campaigns
  has_many :published_campaigns, class_name: 'Campaign', -> { where(published: true) }
  has_many :unpublished_campaigns, class_name: 'Campaign', -> { where(published: false) }
end

class Campaign
  # attribute :published, :boolean
  belongs_to :dealer
end

# code
dealer = Dealer.find(params[:id])
dealer.campaigns.pluck(:id) # => 1, 2, 3, 4
dealer.published_campaigns.pluck(:id) # => 1, 2
dealer.unpublished_campaigns.pluck(:id) # => 3, 4
params[:published_campaign_ids] = [2, 3]
dealer.update_attributes(published_campaign_ids: params[:published_campaign_ids]) # => true

# campaign no 2 still will be published, campaign will become published, campaign no 1 will become unpublished, and campaign no 4 still will be unpublished
dealer.campaigns.pluck(:id) # => 1, 2, 3, 4
dealer.published_campaigns.pluck(:id) # => 2, 3
dealer.unpublished_campaigns.pluck(:id) # => 3, 4
class经销商{where(published:true)}
有很多:未发布的活动,类名称:'Campaign',->{where(published:false)}
结束
阶级运动
#属性:published,:boolean
属于:经销商
结束
#代码
经销商=经销商。查找(参数[:id])
经销商.活动.拔毛(:id)#=>1,2,3,4
经销商。已发布的#u活动。拔毛(:id)#=>1,2
经销商。未发布的#u活动。拔毛(:id)#=>3,4
参数[:已发布的活动ID]=[2,3]
经销商。更新_属性(发布的_活动_ID:params[:发布的_活动_ID])#=>true
#活动2仍将发布,活动将被发布,活动1将被取消发布,活动4仍将被取消发布
经销商.活动.拔毛(:id)#=>1,2,3,4
经销商。已发布的#u活动。弹拨(:id)#=>2,3
经销商。未发布的#u活动。拔毛(:id)#=>3,4

如何使其干净?

您可以使用添加到
经销商
的方法来处理此问题,如下所示:

def setCampaigns(published, ids)
  if published
    self.published_campaign_ids = ids
    self.unpublished_campaign_ids = self.campaign_ids - ids
  else
    self.unpublished_campaign_ids = ids
    self.published_campaign_ids = self.campaign_ids - ids
  end
end
使用起来很简单

dealer.setCampaigns(true, params[:published_campaign_ids]) # to publish campaigns
同样地

dealer.setCampaigns(false, params[:unpublished_campaign_ids]) # to unpublish campaigns

您可以在保存后使用
回调
保存后
太脏;)我也有同样的想法。但您应该了解,这些参数将通过mass_赋值进行赋值,因此最好覆盖my中的
published_campaign_id方法
opinion@asiniy在这种情况下,你的逻辑必须走到某个地方,你可以先调用mass赋值,然后调用上面的函数,它总是多出一行,我相信这已经足够清晰了。如果您愿意,还可以将其更改为不脏的回调。而不是重写方法回调更符合逻辑。