首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails检查嵌套属性项是唯一的

Rails检查嵌套属性项是唯一的
EN

Stack Overflow用户
提问于 2015-05-25 06:41:20
回答 2查看 306关注 0票数 0

我有个问题,我的头开始疼了。我可以看到一个解决方案,但只是需要一只手越过线,或一个完全不同的解决方案。

我用的是rails 4,我有3种型号。

  • 项目(has_many_users通过合作者,has_many_collaborators)
  • 用户(has_many_projects通过协作者,有许多协作者)
  • 协作者(将用户与项目连接起来)

通过jquery将协作者添加到项目中,方法是搜索用户,然后将用户的ID添加到DOM中,这样嵌套的属性就可以做到这一点。

这一切都能工作,但关键是协作者有角色,每个协作者可能在同一个项目中有多个角色。例如,某个人可能同时被列为项目不同部分的摄影师和作者。

目前,正在为每一个新的人/角色添加一个新的合作者(如约翰被添加为一名摄影师,然后在后面的一节中,约翰被添加为一名作家)。

相反,我要做的是检查协作者是否已经存在,如果已经存在,则更新嵌套属性,而不是创建一个新属性。

这样做的一个选择是在用户查找之后使用Jquery,并执行第二个ajax调用,以检查具有项目ID和用户Id的协作者是否存在,如果存在,则将协作者ID添加到dom,以触发正常的嵌套属性行为。

然而,这感觉就像一个非常笨重的方法。如果第二个ajax调用失败了,会发生什么?这也意味着,由于在应用程序的许多部分中添加了协作者,所以必须多次添加jquery /隐藏的字段代码。不太干。

更有意义的是在项目模型或控制器中添加一个方法,检查协作者是否已经存在。

我要做的是循环遍历协作者的嵌套属性,如果已经存在,添加协作者的ID。

我假设我需要查询project_id和user_Id的协作者,如果匹配,那么为协作者添加id属性?

代码语言:javascript
运行
复制
project.rb

def collaborators_attributes=(attrs)
  self.attributes.each do |key,value|

    #How do I check and update the id attribute 

  end      
end

这种方法可能是完全错误的方向,因此,对它的任何援助,或一种新的方法非常值得赞赏。

EN

回答 2

Stack Overflow用户

发布于 2015-05-25 07:01:01

您可以尝试find_or_initialize_by

代码语言:javascript
运行
复制
collaborator = Collaborator.find_or_initialize_by(project_id: project_id, user_id: user_id)
collaborator.update_attributes(Hash)
票数 0
EN

Stack Overflow用户

发布于 2015-05-26 01:12:28

好吧,到目前为止我要做的是

代码语言:javascript
运行
复制
project.rb

#Modify collaborators before save
def collaborators_attributes=(attrs)
  attrs.each do |key,value|
    #loop through collaborators and check if they already exist 
    if Collaborator.where("project_id = ? AND user_id = ?", @attributes["id"], value["user_id"] ).present?
      #if they do exist, add the collaborator id to the attributes
      attrs[key]["id"] = Collaborator.where("project_id = ? AND user_id = ?", @attributes["id"], value["user_id"] ).first.id 
      #I'm adding the project id here, but it may not be required
      attrs[key]["project_id"] = @attributes["id"]
    end
  end 
  #update or create new - based on of a collaborator id passed in attrs
  assign_nested_attributes_for_collection_association(:collaborators, attrs)
end

这感觉很混乱,但似乎奏效了。我正在抓取嵌套的属性,并遍历每个协作者以检查它们是否存在。如果是这样的话,我就将协作者id添加到属性中。然后通过assign_nested_attributes_for_collection_association更新或创建新的

目前唯一的问题是,如果我删除一个合作者,它就会从整个项目中删除他们,而实际上应该把他们标记为摄影师、作家等。我可以用一个类似的循环来解决这个问题,以检查是否增加了任何角色,但这一切都开始让人觉得这是一种很难做的事情。我想我要回到画板上,考虑分解模型,这样一个合作者就可以加入用户和项目,而一个合作者可以有每一个角色,比如摄影师、作家等等。

代码语言:javascript
运行
复制
  User
     Collaborator
         Photographer
         Writer
         Ect
  Project
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30432551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档