2016-01-01 3 views
1

Я работаю над рельсами. У меня есть листинг, который создает списки. При создании формы листинга не существует никаких проверок, кроме некоторых основных полей. Но я не разрешу пользователям публиковать списки, если какое-либо из полей не будет заполнено. На панели инструментов я показываю все свои списки.проверить и найти запись базы данных без данных в рельсах

Но как я могу найти списки с незаполненными полями баз данных ?? .. так что я могу показать его в другой вкладке незавершенных списков для них, чтобы заполнить later..The листинга модель has_many отношении с фотографиями таблица.

Дополнение в ответ Богатых Пека

Для перечисления я добавил поле состояния в моем листинге таблицу с default value0 и его показывая published и draft списков, как ожидается, на моих существующие списки. Но я не могу создать новые записи сейчас ..

Получение ниже ошибок Теперь при обновлении записей

неопределенного метод `проекта? для "проекта": Струнного

Я думаю, что эта проверка вызывает ошибку

validates :bed_room, :bath_room, :listing_name, :summary, :building_name, presence: true, unless: "status.draft?" 

ответ

2

Если вы хотите сохранить текущий поток, вы должны будет pick through any records in the database which might be nil (трудно):

#Controller 
@listings = current_user.listings.unfinished 

#app/models/listing.rb 
class Listing < ActiveRecord::Base 
    def self.unfinished 
    execute(";WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema- instance' as ns) SELECT * FROM Listings WHERE (SELECT Listings.* 
    FOR xml path('row'), elements xsinil, type 
    ).value('count(//*[local-name() != "colToIgnore"]/@ns:nil)', 'int') > 0")   
    end 
end 

У меня нет абсолютно никакой идеи, если выше будет работать. Он использует execute в ActiveRecord для использования чистого SQL-запроса.


не будет препятствовать пользователям публиковать списки

Это звучит, как вы хотите, чтобы draft функциональность.

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

Я знаю, что вы сказали, что у вас это уже есть; Я хотел бы сделать валидацию условно на status от listing ли быть «опубликован» или нет (с enum) ...

#app/models/listing.rb 
class Listing < ActiveRecord::Base 
    enum status: [:draft, :published] #-> defaults to draft 
    belongs_to :user 
    has_many :photos 

    scope :draft,  -> { where status: :draft  } 
    scope :published, -> { where status: :published } 

    #### 

    validates :name, :user, :photos, :etc, :etc, presence: true, unless: "status.draft?" 

    #### 

    def publish! 
     self.update status: :published 
    end 
end 

Это будет работать так же, как «проект» функциональность Wordpress (IE издательство и экономии две совершенно разные вещи):

#config/routes.rb 
resources :listings do 
    post :publish, on: :member #-> url.com/listings/:id/publish 
end 

#app/controllers/listings_controller.rb 
class ListingsController < ApplicationController 
    def new 
     @listing = current_user.listings.new 
    end 

    def create 
     @listing = current_user.listings.new listing_params 
     @listing.save #-> will be "draft" by default so no validations 
    end 

    def publish 
     @listing = current_user.listings.find params[:id] 
     redirect_to @listing if @listing.publish! 
    end 
end 

в вашей передней части вы сможете затем перечислить @listings на они опубликованы или проект ли:

#app/views/listings/index.html.erb 
<% @listings.published do |published| %> 
    ... 
<% end %> 

<% @listings.draft do |draft| %> 
    ... 
<% end %> 

Update

Согласно ОП, ответ должен был использовать следующее в своей модели:

#app/models/listing.rb 
class Listing < ActiveRecord::Base 
    enum status: [:draft, :published] #-> defaults to draft 
    belongs_to :user 
    has_many :photos 

    #### 

    validates :name, :user, :photos, :etc, :etc, presence: true, unless: "draft?" 

    #### 

    def publish! 
     self.update status: :published 
    end 
end 
+0

Точно..Это то, что я искал. Попробуем это и дадим вам знать. Большое спасибо. – Abhilash

+1

Спасибо, человек; не держите меня в верхней части - нижняя часть - это то, что я хотел бы ([соглашение по конфигурации] (https://en.wikipedia.org/wiki/Convention_over_configuration)) –

+0

Я следовал аналогичному шаблону, так как u упоминается. Но я получаю сообщение об ошибке. Я добавил обновление к вопросу с ошибкой. Спасибо. – Abhilash

1

Допуская Listing это название модели и required_field является незаполненным именем поля,

Listing.where (required_field: nil) .where (user: current_user)

будет g ive списки текущего пользователя с незаполненными полями.

listings.includes (фото): .гд (фото: {ID: ноль})

+0

просто быть curious..Is есть какие-либо встроенные помощники доступны использовать из представления? Также как я могу проверить таблицу фотографий так же? – Abhilash

+0

какой вид? вы имеете в виду Javascript? – emaillenin

+0

нет .. от erb ... – Abhilash