Извлечь все записи, кроме тех, с пустым столбцом в Rails - PullRequest
3 голосов
/ 11 марта 2010

Как мне получить все записи 'link', кроме тех, в которых столбец 'url' пуст? Мой контроллер выглядит так:

  def show
    @user = User.find_by_username(params[:username])
    @links = @user.links.all

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @links }

    end
  end

Заранее спасибо!

Редактировать # 1

Если я это сделаю:

@links = @user.all(:conditions => 'url != NULL')

Я получаю сообщение об ошибке:

NoMethodError in UsersController#show 
undefined method `all' for #<User:0x2254f98>

А если я сделаю:

@links = @user.links.all(:conditions => 'url != NULL')

Я все еще получаю все ссылки, даже те, с пустыми полями URL ...

Редактировать # 2

Если я сделаю

@links = User.all(:conditions => 'url != NULL')

Я получаю

ActiveRecord::StatementInvalid in UsersController#show
SQLite3::SQLException: no such column: url: SELECT * FROM "users" WHERE (url != NULL) 

А если я сделаю

@links = Link.all(:conditions => 'url != NULL')

Я все еще получаю все ссылки, даже те, с пустыми полями URL ...

Мне интересно, есть ли разница между NULL и пустым полем?

Редактировать # 3

Теперь мой код выглядит так:

  def show
    @user = User.find_by_username(params[:username])
    @links = @user.links.all(:conditions => "url <> ''")

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @links }

    end
  end

Решение

#controller
@links = @user.links.not_null_url

#model
named_scope :not_null_url, :conditions => "url <> ''"

Это работает! Обязательно зайдите по ссылкам с:

#view
<% @links.each do |link| %>

А не:

#view
<% @user.links.each do |link| %>

Ответы [ 5 ]

6 голосов
/ 11 марта 2010

это не @user, это

User.all(:conditions => 'url != NULL')

EDIT:

На самом деле у меня есть сомнения. Является ли "links" столбцом в таблице пользователей или это модель?

РЕДАКТИРОВАТЬ # 2

Твое это: @user.links.all(:conditions => {:url => !nil})

РЕДАКТИРОВАТЬ # 3

Нашел это! url IS NOT NULL или URL != NULL или что-либо с использованием NULL не решит вашу проблему, потому что, как вы сказали, есть разница между пустым и пустым полями. Код ниже работал для меня:

@user.links.all(:conditions => "url <> ''")

И, как предложил @klew, было бы лучше, если бы вы использовали named_scope:

#model
named_scope :not_null_url, :conditions => "url <> ''"

#controller
@user.links.not_null_url
1 голос
/ 12 марта 2010

Попробуйте:

@links = @user.links.all(:conditions => "url IS NOT NULL")

Было бы лучше, если бы вы добавили его как named_scope в модели Link:

named_scope :not_null_url, :conditions => "url IS NOT NULL"

А затем в контроллере:

@links = @user.links.not_null_url
0 голосов
/ 27 ноября 2011

Вы также можете сделать это в Rails3 Table.where (: col1 =>! Nil,: col1 =>! Nil)

0 голосов
/ 11 марта 2010

@user.all(:conditions => 'url != NULL')

0 голосов
/ 11 марта 2010

Общие советы: Если ваш ORM заставляет вас прыгать через запутанные циклы, просто чтобы выполнить простое предложение WHERE в SQL, попробуйте вместо этого просто использовать SQL.

Где-то в Rails есть простой способ передать его («выбрать * среди пользователей, где имя пользователя, например,« @username »и url not null», имя пользователя), как параметризованный запрос и передать вам набор записей.

В реальном мире это тривиально, но твоя структура усложняет это. Выйдите на секунду ...

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