Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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:按子对象的属性定义父对象模型的范围_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

Sql Rails:按子对象的属性定义父对象模型的范围

Sql Rails:按子对象的属性定义父对象模型的范围,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我很难在Rails中找到一些东西。这可能与我对SQL的了解非常有限有关,因为我对Rails非常了解。我使用的是Rails 5 我有两个模型:申请人模型和申请模型 class Applicant < ApplicationRecord has_one :application has_many :skills accepts_nested_attributes_for :application accepts_nested_attributes_for :skills,

我很难在Rails中找到一些东西。这可能与我对SQL的了解非常有限有关,因为我对Rails非常了解。我使用的是Rails 5

我有两个模型:申请人模型和申请模型

class Applicant < ApplicationRecord
  has_one :application
  has_many :skills

  accepts_nested_attributes_for :application
  accepts_nested_attributes_for :skills, 
    reject_if: ->(skill) { skill[:name].empty? || skill[:experience].empty? }

  validates_with ApplicantValidator
 end

class Application < ApplicationRecord
  belongs_to :applicant
  has_many :notes

  VALID_STATUSES = ["in review", "accepted", "declined", "closed"]

  validates_length_of   :why_interested, minimum: 25
  validates             :accept_terms, acceptance: true
  validates             :status, inclusion: { in: VALID_STATUSES }

  before_validation :set_status

  private

  def set_status
    self.status ||= "in review"
  end
end

我想是这样的。

这会给我一个错误,上面写着,
PG::UndefinedTable:error:missing FROM table“application”
的子句条目,这与我添加的作用域相同。更改application for applications我也尝试过,我得到
ActiveRecord::ConfigurationError:无法将“申请人”加入名为“应用程序”的关联;也许你拼错了?
你将关联名与
连接一起使用
,但是
中的表名与
连接(:application)。其中('applications.status=?',:in_review)
连接(:application)。其中(applications:{status::in_review})
。你必须更改为表名,连接(:applications).where('applications.status..或with includes{includes(:application)。where(applications:{status::in_review})。SQL中的引用(:applications)双引号用于引用标识符(如表名和列名),单引号用于字符串文字,表名也将是复数。您可以说
where('“应用程序”。“status”=“in review”“)
或更好的
where(应用程序:{status:'in review'})
,以便ActiveRecord获取引用的内容。我将其更改为
scope:active,->{joins(:application)。其中({applications:{status:{in review'})})
,并且它不再引发错误,但范围在不应该返回空时返回空。它应该发现什么不是空的?您还可以使用
where(id:Application.select(:applicator\u id)。where(状态:'in review'))
但对于
has\u one
关联,这应该会产生相同的结果。有趣的是-看起来第二种方法在Rails控制台中有效,但在RSpec中无效。我认为问题一定出在我的工厂。谢谢!两个版本应该对
has\u one
做相同的事情。第二种方法在
has\u one
中效果更好关联,因为它避免了联接可能引入的重复项。
scope :active, -> { joins(:application).where('"application"."status" = "in review"') }
scope :in_review_applicants, -> { joins(:application).where('application.status = ?', :in_review) }