Есть ли способ получить данные в базе данных из моделей Ruby-on-Rails - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть приложение rails, работающее вместе с API-интерфейсом rails, в config / initializers / constants.rb есть постоянное значение для DAYS_LIMIT

DAYS_LIMIT = 40
DEFAULT_PRICE = 1.29

, но теперь в приложении я добавил поле ввода, так чточто пользователь решит его DAYS_LIMIT.Поэтому я хочу получить это значение из базы данных внутри моделей API.

Я установил точки останова и вижу, что внутри контроллера API данные передаются из приложения, но не в модели.

отредактировано как запрошенный вопрос, это приложение React-on-Rails, вот код, в котором новое поле ввода сохраняется в базе данных (я удалил другие поля, чтобы вопрос выглядел короче)

export const saveChannel = (files) => {
    return async (dispatch, getState) => {
        const { channel } = getState();
        const {rss_podcast_days} = channel;
        const { image } = files;

    const save = id ? updateChannel : createChannel;

    const sub_required = subscription_required !== undefined ? subscription_required : false;

        const formData = new FormData();
                formData.append('channel[rss_podcast_days]', rss_podcast_days || '');


    if (Object.keys(image).length) {
      formData.append('channel[image]', image);
    }

    const channelId = await dispatch(save(formData, id));

    dispatch(fetchChannel(id));

    return id;
  };
};

из контроллера приложения

podcast_list = RestClient.get("#{ENV['URL_API']}/api/#{@channel.id.as_json}/podcast/list")
      @podcasts = JSON.parse(podcast_list.body)
      @podcasts = @podcasts.sort.reverse.to_h

это от контроллера API, с которого данные передаются из приложения

def index
    podcasts = @channel.podcasts.published.list(params[:page], params[:items_per_page], params[:ordered_in])

    render json: Podcasts::Normalizer.normalize(podcasts, @channel.station.default_podcast_price)
  end

и вот из модели API, которую я хочудля выборки данных вместо констант.

scope :by_days_limit, -> {with_tags.more_recent_than(Date.today - DAYS_LIMIT.days).ordered}

это должно занять сегодняшнюю дату минус значение (DAYS_LIMIT) из пользовательского ввода, но сейчас я получаю undefined local variable or method, если я пытаюсь получить напрямую

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

хорошо, так что я наконец-то понял, я не знаю, должен ли я удалить эту ветку или просто сказать, как я это сделал.Если это неуместно, просто скажите мне, и я удалю весь этот поток.

Итак, вот как я это сделал, в контроллере API мне пришлось добавить свою выборку, чтобы аргументы (список) знали, о чем я говорюоколо.@channel.days_limit

def index
    podcasts = @channel.podcasts.published.list(params[:page], params[:items_per_page], params[:ordered_in], @channel.days_limit)

    render json: Podcasts::Normalizer.normalize(podcasts, @channel.station.default_podcast_price)
end

затем в списке def моделей я добавил days_limit с аргументом

def list(page = nil, nb_items_per_page = 40, ordered_in = 'desc', days_limit)
      ordered_in = ordered_in.in?(['asc', 'desc']) ? ordered_in : 'desc'
      page.blank? ? by_days_limit(days_limit) : by_page(page, nb_items_per_page, ordered_in)
end

и, наконец, в области действия моделей я передам новый аргумент

scope :by_days_limit, -> (days_limit) {with_tags.more_recent_than(Date.today - days_limit.days).ordered}

Теперь пользовательский ввод из приложения передается моделям через контроллер.

0 голосов
/ 04 апреля 2019

Bro, если у вашего класса есть константа, такая как DAYS_LIMIT, вы можете получить к ней доступ, используя сам этот класс, например,

class Demo
  DAYS_LIMIT = 5
end

вы можете получить доступ к этой константе с помощью Demo.DAYS_LIMIT в контроллере или в любом другом месте, где вам это нужно.

удачи!

...