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赋值,然后调用上面的函数,它总是多出一行,我相信这已经足够清晰了。如果您愿意,还可以将其更改为不脏的回调。而不是重写方法回调更符合逻辑。