2015-11-03 5 views
2

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

Все страны являются булевым полем, где в моей таблице рассказов. Логика заключается в том, что Story создается для всех стран в поле, all_countries = 1

Модель Featured Item, где рассказы могут быть представлены на индексной странице, если писатель хотел бы это сделать.

Это как моя модель выглядит как сейчас с областями

class Country < ActiveRecord::Base 
    has_many :stories 
    end 

    class Story < ActiveRecord::Base 
    belongs_to :countries 
    has_many :featured_items, dependent: :destroy 
    scope :by_country, lambda { |id| where(:country_id => id)} 
    scope :for_all_countries, where(:all_countries => true) 

    end 

    class FeaturedItem < ActiveRecord::Base 
    belongs_to :story 
    scope :by_country, -> (country) {joins(:story).where('`stories`.country_id = ?', Country.find(country))} 
    scope :for_all_countries, -> { joins(:story).where('`stories`.all_countries = ?',true) } 
    end 

р/с возможностью для всех стран по признакам предметов также возвращает ошибку.

+0

Можете ли вы отправить сообщение об ошибке, а? –

+0

Я не думаю, что вам нужно найти в этом - 'scope: by_country, -> (страна) {joins (: story) .where (: stories => {: country_id => country})}' должен работать для id или страна экземпляра – Swards

+0

Я думаю, что его обратные тики ... Попробуйте это вместо этого. 'scope: by_country, -> (страна) {joins (: story) .where ('stories.country_id =?', country.id)} scope: for_all_countries, -> {joins (: story) .where ('stories .all_countries =? ', true)} ' –

ответ

3

Вы можете сделать такую ​​вещь:

scope :by_country, -> (country) { country == :all ? where(:all_countries => true) : where(:country_id => country) } 

Вы, возможно, придется добавить немного больше логики для обработки плохих Params.

И для таблицы соединений вы можете присоединиться и фильтровать рассказы.

class FeaturedItem < ActiveRecord::Base 

    scope :by_country, -> (country) { (country == :all ? where(:stories => { :all_countries => true }) : where(:stories => { :country_id => country })).joins(:story) } 

end 
+0

Спасибо! Он работал для модели «История». Но как бороться за столы Join? Это для модели Featured Item. текущая область для текущей страны выглядит так, и я хотел бы, чтобы код также был доступен для охвата всех стран: by_country, -> (country) {joins (: story) .where (''stories'.country_id =? ', Страна.find (country)} ' – Purry

+0

Обновлен с помощью области FeaturedItem – Swards

+0

Спасибо, но он возвращает запросы, в которых история имеет идентификатор current_country id && all_countries == true. Истории, которые необходимо отобразить, - это истории для нынешней страны и для всех стран. – Purry

1

Ваш синтаксис scope в настоящее время не так, как ваша плюрализация в belongs_to ассоциации.

Вы должны будете использовать следующие (@swards ответ является правильным, это лишь дополнение):

#app/models/story.rb 
class Story < ActiveRecord::Base 
    belongs_to :country 
    scope :countries, ->(ids = :all) { ids == :all ? where(all_countries: true) : find(ids) } 
end 

Это позволит вам звонить Story.countries вернуть все страны, и Story.countries(1,2,4,5) вернуть индивидуальные ,

Отфильтровать рассказы по моему указателю на основе двух разных условий, в которых находится текущая страна, а другая для всех стран.

Рассматривали ли вы с помощью следующих в вашей Country модели:

@stories = @country ? @country.stories : Country.stories 

#app/models/country.rb 
class Country < ActiveRecord::Base 
    has_many :stories 
    scope :stories, -> { joins(:stories).where(story: {all_countries: true}) } 
end 
+0

Спасибо, но этот код работал для меня в фильтрации историй для текущей страны и для всех 'scope: by_country, -> (country) {joins (: story) .where ('' stories'.country_id =? Или ' stories'.all_countries = 1 ', country)} ' – Purry