Ruby on rails 将SQL查询转换为Arel时出现问题

Ruby on rails 将SQL查询转换为Arel时出现问题,ruby-on-rails,database,ruby-on-rails-3,arel,Ruby On Rails,Database,Ruby On Rails 3,Arel,我有一个搜索页面,可以缩小特定类的列表,我想要一个OR条件,它可以抓住两个不同的条件并将它们加在一起,例如,我有类 model/party.rb class Party < ActiveRecord::Base has_many :invitations end 这是可行的,但因为它不会延迟加载,所以我不能将它们添加到类似方面的查询中 我做了一些类似的事情 no_invitations.or(no_one_has_answered) 但它没有起作用 我尤其不了解使用AREL或AR

我有一个搜索页面,可以缩小特定类的列表,我想要一个OR条件,它可以抓住两个不同的条件并将它们加在一起,例如,我有类

model/party.rb

class Party < ActiveRecord::Base

  has_many :invitations
end
这是可行的,但因为它不会延迟加载,所以我不能将它们添加到类似方面的查询中

我做了一些类似的事情

no_invitations.or(no_one_has_answered)
但它没有起作用

我尤其不了解使用AREL或AREL的概念,请有人帮忙好吗

编辑:

对于一个非常丑陋但功能性很强的工作,直到我写下来,这里是我所做的

party.rb

  scope :not_confirmed, lambda { joins(:invitations).where( "invitations.status NOT IN (?)", ["accepted", "declined" ] ) }
  scope :with_no_invitations, lambda { includes(:invitaions).where( :invitations => { :party_id => nil } ) }
搜索\u controller.rb

@parties = Party.all_the_shared_queries
@parties = ( @parties.not_confirmed + @parties.with_no_invitations).uniq
查询:

  scope :not_confirmed, lambda { find_by_sql( "SELECT * FROM `parties` INNER JOIN `invitations` ON `invitations`.`party_id` = `parties`.`id` WHERE (invitations.status = 'unanswered') OR (parties.id NOT IN (SELECT DISTINCT(party_id) FROM invitations))" ) }
也可以通过使用布尔代数进行一些转换来转换为。但是,由于它只是理论上的转换,因此必须手动进行验证。因此:

class Invitation < ActiveRecord::Base
   belongs_to :party

   scope :non_answered, -> { where(arel_table[:status].not_eq('unanswered')) }
end

class Party < ActiveRecord::Base
   has_many :invitations

   scope :not_confirmed, -> { not.join(:invitaions).merge(Invitation.non_answered)) }
end
班级邀请{where(arel_表[:status]。not_eq('unanswered'))}
结束
类Party{not.join(:invitations.merge(Invitation.non_-responsed))}
结束

请在此测试并发表评论。

首先,从问题标签中,我假设您使用的是Rails3(如果是Rails4,则有更简单的方法:)

根据您的上述要求(即抓取所有没有任何邀请的参与方,或所有邀请都“未答复”的参与方),以下是一种方法(使用范围:无人参与):

政党模式:

class Party < ActiveRecord::Base
  has_many :invitations
  scope :invitations_answered, -> { joins(:invitations).merge(Invitation.answered) }
  scope :unattended, -> { where(arel_table[:id].not_in invitations_answered.pluck(:id)) }
end
class Party < ActiveRecord::Base
  has_many :invitations
  scope :invitations_answered, -> { joins(:invitations).merge(Invitation.answered) }
  scope :unattended, -> { where.not(id: invitations_answered.pluck(:id)) }
end
邀请模式:

class Invitation < ActiveRecord::Base
  belongs_to :party
  scope :answered, -> { where(status: ["decline", "accept"])}
end
class Invitation < ActiveRecord::Base
  belongs_to :party
  scope :answered, -> { where.not(status: 'unanswered') }
end
班级邀请{where.not(状态:“未应答”)}
结束

我已经更新了答案您可以分享您的范围吗
没有邀请
没有人回答
谢谢您的回答,为了将来的参考,您可以添加如何在Rails4中完成吗。更新它是完全可行的。更新了答案:)谢谢,这就成功了!我没有想过改变条件来得到我需要的,非常感谢!如果没有邀请的话,这不是找不到派对吗?还是我没有理解整件事?@saifis就我所理解的任务而言,你必须选择所有未答复的记录加上未经邀请的记录,对吗?是的,没错。从我所能理解的,上面的不是会检查所有不只是“无动力”的邀请吗?我不知道你用布尔代数将sql转换成areal是什么意思。@Saifis如果你接受了下面的答案,我会回答你。就像这样:
选择。。。其中不包括()
。但我会想again@Saifis你能试试没有args的
#not
吗?
class Party < ActiveRecord::Base
  has_many :invitations
  scope :invitations_answered, -> { joins(:invitations).merge(Invitation.answered) }
  scope :unattended, -> { where.not(id: invitations_answered.pluck(:id)) }
end
class Invitation < ActiveRecord::Base
  belongs_to :party
  scope :answered, -> { where.not(status: 'unanswered') }
end