Если вы хотите сохранить текущий поток, вы должны будет 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
Точно..Это то, что я искал. Попробуем это и дадим вам знать. Большое спасибо. – Abhilash
Спасибо, человек; не держите меня в верхней части - нижняя часть - это то, что я хотел бы ([соглашение по конфигурации] (https://en.wikipedia.org/wiki/Convention_over_configuration)) –
Я следовал аналогичному шаблону, так как u упоминается. Но я получаю сообщение об ошибке. Я добавил обновление к вопросу с ошибкой. Спасибо. – Abhilash