Scope

Siema.
Jak ustawić scopa na pole ‘name’ które jest stringiem

przykładowo mam pole age:integer
wszystko działa
scope :published -> {where(‘age IS NOT NULL’)

ale co kiedy chce zrobic scopa na stringa
ktoś coś?

scope :my_scope, -> { where.not(name: nil) }

My routes:

resources :products do
collection do
get :published
get :surname
end
end

My model:
scope :age_null, {where(‘age IS NOT NULL’)} - its work
scope :surname_null, {where.not(surname: nil)} - to nie dziala

My controller:
def published - to dziala
@products = Product.age_null
render action: ‘index’
end

def surname
@products = Product.surname_null
render action: ‘index’
end

My index:
Ten dziala

<ul>
<li <% if params[:action] == ‘index’ %> class=“active” <%end %>> <%= link_to ‘All articles’, products_path %> </li>

Ten dziala
<li <% if params[:action] == ‘published’ %> class=“active” <%end %>> <%= link_to ‘Only published age yes’, published_products_path %> </li>

Nie dziala
<li <% if params[:action] == ‘surname’ %> class=“active” <%end %>> <%= link_to ‘Only without surname’, surname_products_path %> </li>

</ul>

Co robie źle - dodam jeszcze ze pole:
‘age’ - jest integerem (działa również kiedy typ pola ustawie na boolean)
‘surname’- jest stringiem (i tu nie wiem jak ustawic scopa na to pole zeby pokazac tylko pola które nie sa puste?)

Prawdopodobnie masz tam pustego stringa a nie wartość nul jeśli Ci to nie działa? Nie wyszukuje?
Jeśli masz ustawionego na default ‘’ czyli pusty string powinno działać.
Jeśli nie działa pokaz jeszcze schema

create_table “pruducts”, force: :cascade do |t|
t.string “name”
t.string “surname”
t.integer “date”
t.datetime “created_at”, null: false
t.datetime “updated_at”, null: false
t.boolean “published”
end

Pokaz wynik tego skopa z konsoli a nastepnie również na. All czy masz takie rekordy

schema
Routs Scope


Routes

Wszystko działa na polach ‘age’ oraz ‘date’ - ale jak wykonac scopa na pole które jest stringiem.
Kiedy klikne na link_to ‘Only without name’
pokazuje wszystkie rekordy!
Wszystkie rekordy stworzone przez aplikacje.

w Product scope :name_null zwraca te rekordy ktrorych name jest rozny od zera … czyli wszystkie rekordy z bazy

“only without name” - potrzebujesz te ktore:

  1. nie sa wypelnione (is null)
  2. lub sa wypelnione pustym String
scope :without_name, -> {where("name IS NULL OR name = ''")}

Your answer is correct - THANKS DarkCoin :slight_smile: