Хороший способ сделать проверку двух столбцов - PullRequest
0 голосов
/ 21 декабря 2010

Я использую Rails 3 для этого. У меня есть модель коллекций, модель пользователя и модель промежуточной подписки. Таким образом, пользователь может подписаться на несколько коллекций с определенной ролью. Однако я не хочу, чтобы пользователь мог подписываться на одну и ту же коллекцию дважды.

Итак, в моей модели подписки есть что-то вроде:

validate :subscription_duplicates

def subscription_duplicates
  self.errors.add_to_base "This user is already subscribed" if Subscription.where(:user_id => self.user.id, :collection_id => self.collection.id)
end

Однако это кажется уродливым. Кроме того, он прерывается, когда я хочу сделать что-то вроде следующего в моем контроллере коллекции:

def create
  @collection = Collection.new(params[:collection])
  @collection.subscriptions.build(:user => current_user, :role => Subscription::ROLES['owner'])
  @collection.save
  respond_with(@collection)
end

Когда я делаю сборку, у подписки нет идентификатора, поэтому я получаю ошибку "Called id for nil".

Спасибо за любые советы!

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

использовать validates_uniqueness_of

validates_uniqueness_of :user_id, :scope => :collection_id
0 голосов
/ 21 декабря 2010

Прежде всего, ваше действие создания должно всегда проверять, был ли объект сохранен, а если нет, то обрабатывать это (обычно путем повторного рендеринга новой страницы / редактирования и отображения ошибок пользователю).

Стандартный вид действия создания будет выглядеть следующим образом (для @post в данном случае):

def create
  @post = Post.new(params[:post])
  @created = @post.save
  respond_to do |format|
    if @created
      flash[:notice] = 'Post was successfully created.'
      format.html { redirect_to @post }
      format.xml  { render :xml => @post, :status => :created, :location => @post }
      format.js
    else
      format.html { render :action => :new } #or edit or wherever you got here from
      format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      format.js
    end
  end
end 

Подход Shingara к избеганию дубликатов должен работать для вас нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...