Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filters by remote_availibity, location, position_type in query object #39

Merged
merged 9 commits into from
Apr 15, 2020

Conversation

asusikov
Copy link
Contributor

@asusikov asusikov commented Jun 24, 2019

What this PR do?

  • add to vacancy query object few filters: remote_availibity, location, position_type (just ability to filter, not ui controls)

Related to #33 and #38

@asusikov asusikov changed the title Filters by remote_availibity, location, position_type in query object [WIP] Filters by remote_availibity, location, position_type in query object Jun 25, 2019
@asusikov
Copy link
Contributor Author

@davydovanton Еще вопрос про dry-struct - можно ли как-то игнорировать не переданные параметры в конструктор? default только работает если ни одно значение не передано, если хоть одно, то ругается что других нет. Нашел только meta(required: false), но это не то. В документации есть про meta(omittable: true), но оно не работает и в коде не нашел ничего подобного. А то постоянно прокидывать все аттрибуты с nil как-то не айс

@davydovanton
Copy link
Owner

@asusikov не очень понял вопрос про драй структуру. можешь пример кода показать или тыкнуть в ПР-е?

@asusikov
Copy link
Contributor Author

asusikov commented Jun 26, 2019

Я про то чтобы можно было сделать вот так

Queries::Vacancy::SearchQuery.new(remote: true)

Сейчас получаю ошибку

Dry::Struct::Error ([Queries::Vacancy::SearchQuery.new] :position_type is missing in Hash input)

И приходится делать вот так

Queries::Vacancy::SearchQuery.new(remote: true, position_type: nil, location: nil)

И если понадобится новый аттрибут, то получится везде надо будет его прокидывать. Вот можно сделать настроить схему так, чтобы он не ругался, что мы не все ключи передали?

@davydovanton
Copy link
Owner

в документации нашел такой пункт


Tolerance to missing keys

You can mark certain keys as optional with adding meta omittable: true to theirs types.

class User < Dry::Struct
  attribute :name, Types::Strict::String
  attribute :age,  Types::Strict::Integer.meta(omittable: true)
end

user = User.new(name: 'Jane')
# => #<User name="Jane" age=nil>
user.age
# => nil

In the example above nil violates the type constraint so be careful with :omittable.


Вот ссылка на саму документацию:
https://dry-rb.org/gems/dry-struct/recipes/

Думаю omittable + default должно хватить в этом случае

@asusikov
Copy link
Contributor Author

asusikov commented Jun 28, 2019

Да, я это и пробовал - не работало. Но кажется разобрался в чем дело - у нас dry-structs версии 0.3.1 а это дело вроде с 0.5.0. Сходу у меня обновится не получилось - оставил пока как есть

@asusikov asusikov changed the title [WIP] Filters by remote_availibity, location, position_type in query object Filters by remote_availibity, location, position_type in query object Jun 28, 2019
@asusikov
Copy link
Contributor Author

@davydovanton Замечания поправил - посмотри еще раз, пожалуйста.

@asusikov
Copy link
Contributor Author

asusikov commented Oct 1, 2019

@davydovanton Что с этим PR? Есть какие-то еще замечания?

@JuPlutonic
Copy link

JuPlutonic commented Oct 4, 2019

@asusikov я заметил что мердж поверх #38 делать нельзя т.к.

  1. задисейблены все поля отвечающие за фильтрацию. apps/web/templates/vacancies/index.html.slim
  2. когда работаешь с url запросами - работают только на один атрибут (второй query_attribute переданный ч/p GET ?query=КАКОЙ-ТОПЕРВЫЙАТРИБУТ:true&ВТОРОЙАТРИБУТ:contractor всегда игнорируется, а nil в качестве ключа обламывает контроллёр: key not found: "nil" in /apps/web/controllers/vacancies/index.rb:41, конечно же хочется чтобы уже SearchQuery омитил такие атрибуты...

@@ -9,7 +9,8 @@ class Index

include Import[
'libs.search_query_parser',
operation: 'vacancies.operations.list'
operation: 'vacancies.operations.list',
search_options_mapper: 'vacancies.mappers.search_options',

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не принципиально, но тут лишняя запятая

@asusikov
Copy link
Contributor Author

asusikov commented Oct 9, 2019

@JuPlutonic Спасибо за замечания!

  1. Я так понял, что сначала этот PR мержим, а потом уже делаем все в интерфейсе отдельными PR'ами. @davydovanton, рассуди.
  2. Параметры будут передаваться не через &, а через пробел( ). Вот здесь я как раз этот момент уточнял. Про nil посмотрю

@davydovanton
Copy link
Owner

привет, я сейчас все посмотрю и рассужу. спасибо всем за помощь

Copy link
Owner

@davydovanton davydovanton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в целом все выглядит разумно. я бы сначал замержил этот ПР потом второй. Жду мелких правок

@@ -35,7 +36,9 @@ def call(params)
private

def search_query
params[:query] ? search_query_parser.call(params[:query]) : EMPTY_SEARCH_QUERY
query_attributes = params[:query] ? search_query_parser.call(params[:query]) : EMPTY_SEARCH_QUERY
initial_attributes = { remote: nil, position_type: nil, location: nil }
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я бы в константу это вынес

@@ -35,7 +36,9 @@ def call(params)
private

def search_query
params[:query] ? search_query_parser.call(params[:query]) : EMPTY_SEARCH_QUERY
query_attributes = params[:query] ? search_query_parser.call(params[:query]) : EMPTY_SEARCH_QUERY
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а еще лучше, я бы сделал так, что квери парсер возвращал бы сразу что надо, вне зависимости от того, что туда передать, что-то в таком духе:

query_attributes = search_query_parser.call(params[:query])

query_attributes # => attributes or initial_attributes

def all_with_contact_relation(limit:, page:, search_query:)
query = repo.aggregate(:contact)
.where(published: true, archived: false, deleted_at: nil)
search_query.to_h.each do |key, value|
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

реально оптимизировать этот кусок? что бы при nil код не выполнялся?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не совсем понял вопрос

Copy link

@JuPlutonic JuPlutonic Oct 13, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

может быть:

if search_query
 ...
end
search_query.to_h.each do |key, value|

@davydovanton
Copy link
Owner

и можешь ребейз сразу сделать от мастера?

@asusikov
Copy link
Contributor Author

Да, конечно. Думаю в ближайшее смогу все сделать

@davydovanton
Copy link
Owner

Привет, прости, что задержал ПР. я решил его замержить и уже самостоятельно доделать. Спасибо большое, если что - я могу прислать сюда ссылку на коммит с изменениями

@davydovanton davydovanton merged commit 1ac5c74 into davydovanton:master Apr 15, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants