Rails 4 스타일의 람다와 인수가있는 범위?


144

Rails 4에서 다음이 어떻게 수행되는지 궁금합니다. 또는 Rails 3 접근법을 사용하여 람다를 사용하여 인수를 3과 같은 방식으로 전달할 수 있습니다.

저는 Rails 3을 처음 접했고 Rails 4를 실행하는 일부 샘플을 통해 작업하려고합니다.

내 Rails 3 코드는 다음과 같습니다.

class Person < ActiveRecord::Base
  scope :find_lazy, lambda {|id| where(:id => id)}
end

# In console I can call
Person.find_lazy(1)

이것이 Rails 4 방식이라면-> {}를 사용하는 것이 람다입니다. 맞습니까? scope :all_lazy, -> { select("*") }인수가 필요한 경우 어떻게합니까? -> {}을 사용할 때 몇 가지 다른 아이디어를 시도하고 콘솔에서 인수 오류가 발생합니다.

답변:


305

나는 그것이 있어야한다고 생각합니다 :

scope :find_lazy, -> (id) { where(id: id) }

2
지원 문서 , 섹션 14.1 구체적으로.
Dennis

3
예, scope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
글쓰기를

4
Ruby 1.9를 사용하는 경우 짧은 람다 구문은 화살표와 매개 변수 ( scope :find_lazy, ->(param)) 사이에 공백을 허용하지 않습니다 . Ruby 2+에서는 공백이 허용됩니다. 여기에 더 많은 정보를 원하시면 ...
furman87

루비에서 "현대"Syntexscope :find_lazy, -> id { where id: id }
swordray

11

루비는 이전 스타일의 람다를 더 이상 사용하지 않았으므로, 사용하는 것이 더 편하다고 느끼면 꼭 사용하십시오.

나는 개인적으로 스테이 비 람다의 구문을 좋아하지 않지만 결국에는 표준이 될 것이므로 익숙해지지 않을 것입니다.


6
구문이 마음에 들지만 화살표와 함수 본문 사이에 인수를 배치하는 것이 잘못되었다는 느낌이 들지만 "(id)-> {where ...}"는 훨씬 매력적입니다. 내 수학 지식이나 커피 스크립트 구문으로 중단하십시오). 결국 "->"는 값에 결과를 매핑하는 것과 같은 것을 말합니다.
hurikhan77

Rails 4.2에서 이전 스타일을 사용하면 데이터베이스에서 잘못된 부울 값이 반환되는 상황이 발생했습니다. 공식적으로 사용되지 않을 수도 있지만 업데이트 된 구문을 사용하면 문제가 해결되었습니다.
stevenspiel

1
@ hurikhan77 네, 문법이 CoffeeScript coffeescript.org/#functions
Chloe

8

Rails 4를 통해 다음을 수행 할 수 있습니다.

scope :find_lazy, -> (id) { where(id: id) }

그것은 오래된 루비에있었습니다.

:id => id

더 나은 해시 :

id: id

5

나는 보통 아래 프로그래밍 구문을 사용하고 있었다.

scope :find_lazy, -> (id) { where(id: id) }

그러나 Codacy를 사용하여 코드를 검토 할 때이 구문에 대해 경고하는 것을 발견했습니다.

Use the `lambda` method for multiline lambdas.

나는 그것을 변경했고 잘 작동했다.

  scope :find_lazy, lambda {|id|
    where(id: id)
  }

2

연결을 지원하려면

scope :find_lazy, -> (object) { where(object_id: object.id) }

1
scope :find_lazy, -> (id) { where(id: id) }

와 동등하다

self.find_lazy(id)
  where(id: id)
end

루비 온 레일 가이드를 기반으로 :Using a class method is the preferred way to accept arguments for scopes.

클래스 메소드보다 람다와 함께 범위를 사용하는 이유는 없습니다. 개인적인 취향의 문제입니다. 그러나 지침을 따르려면 인수가 포함될 때 클래스 메소드를 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.