Sql Rails:按子对象的属性定义父对象模型的范围
我很难在Rails中找到一些东西。这可能与我对SQL的了解非常有限有关,因为我对Rails非常了解。我使用的是Rails 5 我有两个模型:申请人模型和申请模型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,
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) }