首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为模型范围方法创建规范?

如何为模型范围方法创建规范?
EN

Stack Overflow用户
提问于 2020-04-08 13:56:51
回答 2查看 94关注 0票数 1

我在评估模型中有scope方法,我在AssessmentsController中对评估集合调用了这个方法,但是我不能为这个方法创建测试,因为: 1)响应时我没有得到risk_value,但是在控制器(@assessments.with_assessment_progresses(@customer_id))中我得到了以下内容:

代码语言:javascript
复制
[
  {
    "id": 4,
    "name": "Assessment_1",
    "created_at": "2020-04-01T17:29:50.528Z",
    "updated_at": "2020-04-01T17:29:50.528Z",
    "risk_value": "3.92156862745098"
  },
  ...
]

2)我不明白如何从结果中删除created_atupdated_at

app/models/assessment.rb

代码语言:javascript
复制
scope :with_assessment_progresses, ->(customer_id) {
  joins(Arel.sql("LEFT JOIN assessment_progresses ON (assessment_progresses.assessment_id = assessments.id AND assessment_progresses.customer_id = #{customer_id})")).
  select("assessments.*, assessment_progresses.risk_value")
}

spec/models/assessment_spec.rb

代码语言:javascript
复制
describe "Method 'with_assessment_progresses'" do
  let!(:admin)                     { create(:admin) }
    let!(:customer)                { create(:customer, created_by: admin.id) }
  let!(:assessment)                { create(:assessment) }
    let!(:assessment_progress_1)   { create(:assessment_progress, customer_id: customer.id, assessment_id: assessment.id, risk_value: 3.812) }

  it "return assessments with risk_value for customer" do
    assessment_with_risk = Assessment.with_assessment_progresses(customer.id)

    assessment_with_risk.delete("created_at")
    assessment_with_risk.delete("updated_at")

    expect(assessment_with_risk.length).to eq(1)
    expect(assessment_with_risk).to eq(
      [
        {
          "id"=> assessment.id,
          "name"=> assessment.name,
          "risk_value"=> assessment_progress_1.risk_value
        }
      ]
    )

  end
end
EN

回答 2

Stack Overflow用户

发布于 2020-04-08 15:10:06

你用

代码语言:javascript
复制
.select("assessments.*, assessment_progresses.risk_value")

created_atupdatet_at来自于assessements.*,这些列自动为活动记录模型生成。如果您只想要某些值,则只选择

代码语言:javascript
复制
.select("assessments.id, assessments.name ,assessment_progresses.risk_value")
票数 0
EN

Stack Overflow用户

发布于 2020-04-08 16:37:07

我解决了这个问题:

代码语言:javascript
复制
Assessment.with_assessment_progresses(customer.id).as_json

我用以下方式删除时间戳:

代码语言:javascript
复制
object.each{ |h| h.delete("updated_at") && h.delete("created_at")}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61102464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档