gpt4 book ai didi

ruby-on-rails - :has_many through association 中的多个条目

转载 作者:行者123 更新时间:2023-12-04 06:18:50 25 4
gpt4 key购买 nike

我需要一些关于我正在使用 rails 3 进行的 rails 开发的帮助。
这个应用程序是在几个月前刚推出后给我的,从那时起我就非常喜欢 Ruby。

我有一组可以通过团队表分配资源的项目。

团队记录具有开始日期和结束日期(即资源从项目中分配和取消分配的时间)。

如果用户已从项目分配和取消分配,并且在以后将他们分配回项目,
我想在 Teams 表中创建一个新条目,而不是覆盖结束日期,以便能够跟踪将资源分配给某个项目的日期。

所以我的问题是,是否可以通过关联在 :has_many 中有多个条目?

这是我的协会:

class Resource < ActiveRecord::Base
has_many :teams
has_many :projects, :through => :teams
end

class Project < ActiveRecord::Base
has_many :teams
has_many :resources, :through => :teams
end

class Team < ActiveRecord::Base
belongs_to :project
belongs_to :resource
end

我在 Project.rb 中还有以下功能:
after_save  :update_team_and_job

private
def update_team_and_job

# self.member_ids is the selected resource ids for a project

if self.member_ids.blank?
self.teams.each do |team|
unless team.deassociated
team.deassociated = Week.current.id + 1
team.save
end
end
else
self.teams.each do |team|

#assigning/re-assigning a resource

if self.member_ids.include?(team.resource_id.to_s)
if team.deassociated != nil
team.deassociated = nil
team.save
end
else

#de-assigning a resource

if team.deassociated == nil
team.deassociated = Week.current.id + 1
team.save
end
end
end

y = self.member_ids - self.resource_ids
self.resource_ids = self.resource_ids.concat(y)

self.member_ids = nil
end
end
end

最佳答案

当然,您可以有多个关联。 has_many 接受一个 :uniq 选项,您可以将其设置为 false,并且如文档所述,它对于 :through rel'ns 特别有用。

您的代码正在查找现有团队并设置解除关联,而不是添加一个新团队(我认为将其命名为 TeamMembership 会更好)

我想你只想做这样的事情:

  • 为事件成员(member)添加一个关联(但在这个使用 uniq:=> true:
    has_many :teams
    has_many :resources, :through => :teams, :uniq => false
    has_many :active_resources,
    :through => :teams,
    :class_name => 'Resource',
    :conditions => {:deassociated => nil},
    :uniq => true
  • 添加时,如果不存在,则添加到 active_resources,并“解除关联”任何已删除的团队:
    member_ids.each do |id|
    resource = Resource.find(id) #you'll probably want to optimize with an include or pre-fetch
    active_resources << resource # let :uniq => true handle uniquing for us
    end

    teams.each do |team|
    team.deassociate! unless member_ids.include?(team.resource.id) # encapsulate whatever the deassociate logic is into a method
    end

  • 更少的代码,更惯用的。此外,代码现在更明确地反射(reflect)了业务建模

    警告:我没有为此编写测试应用程序,代码可能缺少一两个细节

    关于ruby-on-rails - :has_many through association 中的多个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7143703/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com