【问题标题】:DataMapper => One-to-Many filterDataMapper => 一对多过滤器
【发布时间】:2011-01-17 21:45:53
【问题描述】:
class Task
  include DataMapper::Resource
  has 1, :list, :through => Resource
end

class List
  include DataMapper::Resource
  has n, :tasks, :through => Resource
end

一个列表有很多任务。假设我有一个 id = 1 的任务。

如何找到有此任务的列表?

我试过:List.first(:tasks => task) 但它总是返回 nil。

谢谢。

【问题讨论】:

    标签: ruby sinatra datamapper one-to-many


    【解决方案1】:

    Task.first(:id => 1).list 呢?顺便说一句,你真的应该改变你的模型的定义。我建议您阅读数据映射器文档thoroughly

    class Task
      include DataMapper::Resource
    
      belongs_to :list
    end
    
    class List
      include DataMapper::Resource
    
      has n, :tasks
    end
    

    这样看起来不是更好吗?哦,我希望你定义了键。这些对于运作良好的协会很重要。如果idTask 的键,您的查询将简化为Task.get(1).list

    【讨论】:

      【解决方案2】:

      你可以像这样使用嵌套条件:

      List.first(:tasks => { :id => task.id })
      

      但是给定一个任务,使用task.list会更简单

      【讨论】:

        【解决方案3】:

        为什么你有 has 1 through 资源?我会做 Task.belongs_to :list 然后 List.has n, :tasks 所以你可以写:

        List.first :"tasks.id" => task.id
        

        虽然如果你已经拿到了任务,那么写 task.list 会更简单 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-14
          • 2016-01-22
          相关资源
          最近更新 更多