【问题标题】:one-many-many assoc find conditions一对多关联查找条件
【发布时间】:2023-04-08 08:24:01
【问题描述】:

我有以下型号:

project.rb

has_many :tasks

task.rb

belongs_to :project
has_many :assignments
has_many :users, :through => :assignments

user.rb

has_many :assignments
has_many :tasks, :through => :assignments

assignment.rb

belongs_to :task
belongs_to :user

例如: Project.first.title #=> "曼哈顿" Project.first.tasks.map(&:name) # => ['Find Scientists', 'Find Money', 'Find Location'] Project.first.tasks.first.users.map(&:full_name) #=> ['James Maxwell', 'Evariste Galois', 'Jules Verne']

我的第一个问题是: 我怎样才能找到所有可能带有符号的人的名字来一次触发,我试过了:

Project.first.tasks.users.full_name #=> AND FAILED Project.first.tasks.map(&:users).full_name #=> AND FAILED Project.first.tasks.map(&:users).map(&:full_name) #=> AND FAILED

有什么想法吗?

我认为以下问题可能在同一个球场:

如何使用搜索用户任务的“全名”属性的条件来查找项目?

示例

Project.all(:include => {:tasks => :users}, :conditions => ['tasks.users.full_name LIKE ?', query]) #this failed

我认为问题出在“tasks.users”。

谢谢大家,感恩节快乐!

【问题讨论】:

    标签: ruby-on-rails activerecord include


    【解决方案1】:

    对于第一个,您需要执行以下操作:

    Project.first.tasks.map { |t| t.users.map(&:full_name) }.flatten
    

    这样做的原因是您想要遍历所有任务,然后是每个任务中的所有用户。如果没有展平,这将为您提供一个二维数组。

    第二个你的发现应该是:

    Project.all(:include => {:tasks => :users}, :conditions => ['users.full_name LIKE ?', query])
    

    写入users.full_name 向SQL 引擎暗示您正在users 表上查找full_name 字段。

    【讨论】:

    • 哦,我明白了,所以我实际上不必这样做 :conditions => ['tasks.users.full_name Like ?', query] 因为包含用户允许 1) 使用用户排序-of "stand-alone" 和 2) 在查询时适当地限定为任务。搜索项目任务的所有用户全名有效! - 对于为什么我们可以链接多对多关联以产生一些“总计”属性,是否存在计算机科学/数学偏好?像 Project.first.tasks.users.map(&:full_name) 我可以想象人们需要这个感谢雷达的场景。请考虑关闭案例。节日快乐!
    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多