Я новичок в рельсах. Я вижу, что есть много способов найти запись:
find_by_<columnname>(<columnvalue>)
find(:first, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>).first
И похоже, что все они в конечном итоге генерируют один и тот же SQL. Кроме того, я считаю, что то же самое верно и для поиска нескольких записей:
find_all_by_<columnname>(<columnvalue>)
find(:all, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>)
Есть ли практическое правило или рекомендация, какой из них использовать?
источник
find_by
не устарел, но синтаксис немного изменился. Отfind_by_name("Bob")
доfind_by(:name, "Bob")
.find_by(name: "Bob")
find_by_...
что я устарел, у вас есть источник? Кажется,find_by
иfind_by_...
оба они по-прежнему поддерживаются в Rails 4.где возвращает ActiveRecord :: Relation
Теперь посмотрим на реализацию find_by:
Как видите, find_by совпадает с where, но возвращает только одну запись. Этот метод следует использовать для получения 1 записи и where следует использовать для получения всех записей с некоторыми условиями.
источник
find_by
будет спасать::RangeError
отwhere(*args)
и возвратного ноля.Model.find
1- Параметр: ID объекта для поиска.
2- Если найдено: возвращает объект (только один объект).
3- Если не найден: вызывает
ActiveRecord::RecordNotFound
исключение.Model.find_by
1- Параметр: ключ / значение
Пример:
2- Если найдено: возвращает объект.
3- Если не найден: возвращается
nil
.Примечание: если вы хотите поднять,
ActiveRecord::RecordNotFound
используйтеfind_by!
Model.where
1- Параметр: такой же, как
find_by
2- Если найдено: он возвращает
ActiveRecord::Relation
одну или несколько записей, соответствующих параметрам.3- Если не найден: он возвращает пустой
ActiveRecord::Relation
.источник
Существует разница между
find
иfind_by
в том, чтоfind
будет возвращать ошибку, если она не найдена, тогда какfind_by
вернет null.Иногда легче читать, если у вас есть метод вроде
find_by email: "haha"
, а не.where(email: some_params).first
.источник
Начиная с Rails 4 вы можете:
что эквивалентно
find_by_name
в Rails 3.Используйте,
#where
когда#find
и#find_by
этого недостаточно.источник
find_by
а почему нетfind_by_<column_name>
. Мне нужно, чтобы кто-то ответилfind_by_name
в Rails 4? Насколько я знаю, он не устарел .find_by(name: "Rob*")
Принятый ответ обычно охватывает все это, но я хотел бы кое-что добавить, на всякий случай, если вы планируете работать с моделью таким образом, как обновление, и вы получаете одну запись (о которой
id
вы не знаете), Тогдаfind_by
это путь, потому что он извлекает запись и не помещает ее в массивно если вы используете
where
то вы не можете обновить его напрямуюв таком случае вам нужно будет указать это так
источник
Помимо принятого ответа, также верно следующее
Model.find()
может принимать массив идентификаторов и возвращать все совпадающие записи.Model.find_by_id(123)
также принимает массив, но обрабатывает только первое значение идентификатора, присутствующее в массивеисточник
Оба # 2 в ваших списках устарели. Вы все еще можете использовать
find(params[:id])
.Как правило,
where()
работает в большинстве ситуаций.Вот отличный пост: http://m.onkey.org/active-record-query-interface
источник
Все ответы, данные до сих пор, в порядке.
Однако одно интересное отличие состоит в том, что
Model.find
поиск выполняется по идентификатору; если он найден, он возвращаетModel
объект (только одну запись), но вActiveRecord::RecordNotFound
противном случае выдает .Model.find_by
очень похож наModel.find
поиск в любом столбце или группе столбцов в базе данных и позволяет выполнять поиск, но возвращается,nil
если поиску не соответствует ни одна запись.Model.where
с другой стороны, возвращаетModel::ActiveRecord_Relation
объект, который похож на массив, содержащий все записи, соответствующие поиску . Если запись не найдена, возвращается пустойModel::ActiveRecord_Relation
объект.Я надеюсь, что они помогут вам решить, что использовать в любой момент времени.
источник
Допустим, у меня есть модель
User
User.find(id)
Возвращает строку, в которой первичный ключ = id. Тип возврата будет
User
object.User.find_by(email:"abc@xyz.com")
В этом случае возвращает первую строку с совпадающим атрибутом или адрес электронной почты. Тип возврата снова будет
User
объектом.Примечание: -
User.find_by(email: "abc@xyz.com")
аналогичноUser.find_by_email("abc@xyz.com")
User.where(project_id:1)
Возвращает всех пользователей в таблице пользователей, где совпадают атрибуты.
Здесь тип возврата будет
ActiveRecord::Relation
object.ActiveRecord::Relation
class включаетEnumerable
модуль Ruby, поэтому вы можете использовать его как массив и перемещаться по нему.источник
Лучшая часть работы с любой технологией с открытым исходным кодом - это то, что вы можете изучить ее вдоль и поперек. Проверить эту ссылку
find_by ~> Находит первую запись, соответствующую указанным условиям. Здесь нет подразумеваемого заказа, поэтому, если порядок имеет значение, вы должны указать его самостоятельно. Если запись не найдена, возвращается ноль.
find ~> Находит первую запись, соответствующую указанным условиям, но, если запись не найдена, вызывает исключение, но это делается намеренно.
Проверьте ссылку выше, в ней есть все объяснения и варианты использования для следующих двух функций.
источник
Я лично рекомендую использовать
источник