Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails中WHERE子句中的所有运算符_Sql_Ruby On Rails_Postgresql_Relational Division - Fatal编程技术网

Sql Rails中WHERE子句中的所有运算符

Sql Rails中WHERE子句中的所有运算符,sql,ruby-on-rails,postgresql,relational-division,Sql,Ruby On Rails,Postgresql,Relational Division,关联如下所示 InstructorStudent has_many :fees Fee belongs_to :instructor_student 我想得到在所有给定数组中具有每月详细信息的讲师学生。如果其中任何一项中没有月度详细信息,则不应返回任何记录 due_month = ["2017-01-01","2017-02-01",,"2017-03-01"] 以下是我尝试过的查询,我想获取属于所有给定三个到期月的讲师学员,如果任何月份没有数据,则应返回nil: @fee_paid =

关联如下所示

InstructorStudent has_many :fees

Fee belongs_to :instructor_student
我想得到在所有给定数组中具有每月详细信息的讲师学生。如果其中任何一项中没有月度详细信息,则不应返回任何记录

due_month = ["2017-01-01","2017-02-01",,"2017-03-01"]
以下是我尝试过的查询,我想获取属于所有给定三个到期月的
讲师学员
,如果任何月份没有数据,则应返回
nil

@fee_paid = 
InstructorStudent.first.joins(:fees).where("fees.monthly_detail = 
ALL(ARRAY[?]::date[]) AND fees.course_type = ?", due_month.map{|i| i 
},"per month");
编辑1:

@erwin brandstetter这是我的最后一个问题

InstructorStudent.where("
  instructor_students.Id IN (?)",Instructor.find(17).per_month_active_student
).joins(
  "INNER JOIN fees ON fees.instructor_student_id = instructor_students.id LEFT OUTER JOIN fee_payment_notifications ON fee_payment_notifications.fee_id = fees.id"
).where(
  "fee_payment_notifications.status <> ? AND
  fees.monthly_detail = ANY(ARRAY[?]::date[]) AND
  fees.course_type = ? AND
  fees.payment_status <> ?"
  , 'Paid',dueMonth,"per month", "Due"
).group(
  'fees.instructor_student_id'
).
having(
  'count(*) = ?', dueMonth.length
)
这里是我为招收指导学生所做的。其中的fees.monthly\u详细信息以duemorth和fees.payment\u状态为“到期”,fees.course\u类型为“每月” 费用支付通知不应“支付”

不强制要求始终存在费用支付通知。 所以,如果fee有fee\u payment\u通知,那么它应该检查它的状态。 如果没有任何费用支付通知,则应提取记录。
如果有任何费用支付通知且状态为“已支付”,则不应提取记录。

您可以将月份转换为Ruby的日期类,并让ActiveRecord完成以下工作:

due_month= ["2017-01-01","2017-02-01","2017-03-01"]    
fee_paid = InstructorStudent.joins(:fees).where("fees.monthly_detail" => due_month.map{|month| Date.parse month}, "fees.course_type" => "per month")
这是一个很好的例子

实际的表定义(标准1:n关系,由Ruby ORM隐藏)如下:

CREATE TABLE instructor_student (
   id serial PRIMARY KEY
   name ...
);

CREATE TABLE fees (
   id serial PRIMARY KEY
 , instructor_student_id integer NOT NULL REFERENCES instructor_student
 , course_type ...
 , monthly_detail date
 , UNIQUE (instructor_student_id, course_type, monthly_detail)
);
您尝试查询时,会有效地根据给定数组中的多个值测试
fees
中的每一行,当数组的元素不相同时,测试总是失败。一个值不能与多个其他值相同。您需要一种不同的方法:

SELECT instructor_student_id
FROM   fees
WHERE  course_type = ?
AND    monthly_detail = ANY(ARRAY[?]::date[])  -- ANY, not ALL!
GROUP  BY instructor_student_id
HAVING count(*) = cardinality(ARRAY[?]::date[]);
这是假设数组中的distinct值和表中的唯一条目是由我上面添加的
unique
约束强制执行的。否则,计数不可靠,您必须使用更复杂的查询。下面是一个选项库:

正如您所看到的,我根本没有涉及到表
讲师\学生
。虽然引用完整性是通过FK约束强制执行的(通常是这样),但我们可以单独使用
费用
来确定合格的
讲师\学生\ id
。如果需要从主表中获取更多属性,请在第二步中执行,如:

SELECT i.*  -- or whatever you need
FROM   instructor_student i
JOIN  (
   SELECT ...  -- query from above
   ) f ON f.instructor_student_id = i.id
;

@Erwin Brandstetter很抱歉反应太晚。但它仍然不起作用。我有一个记录,它每月只在2月份有详细信息,不在1月份,但当我搜索1月份和2月份的时候。它仍然能找到那张唱片。“这个查询中缺少了一些内容。@Vishal:我很有信心我的查询会像广告中所说的那样有效。”<代码>将计数(*)设为2将消除只有1个匹配条目的学生。你必须发布一个演示,让我们找到误解。试试dbfidle.uk…@ErwinBrandstetter请查看我编辑的有问题的vesrion。你好@ErwinBrandstetter,我发布了另一个问题和另一个问题。你能看一下吗。解决我的问题。这将对我很有帮助。这是问题@ErwinBrandstetter你能帮我解决这个问题吗?
SELECT i.*  -- or whatever you need
FROM   instructor_student i
JOIN  (
   SELECT ...  -- query from above
   ) f ON f.instructor_student_id = i.id
;