Я использую этот термин сам, и это потому, что это мой стиль, я не использую boost, stl или некоторые другие вещи, даже не стандартные библиотеки C ++, такие как «cout» и «cin», я программирую на C, но использование классов, шаблонов и других (не библиотечных) функций для моего преимущества.
Я могу сказать, что я не мастер C, не мастер C ++, но я действительно хорош в этом конкретном стиле, который я использую с 10 лет назад. (и я все еще поправляюсь!)
Общая идея состоит в том, чтобы как можно больше придерживаться запросов, созданных с помощью ActiveRecord
, и используйте фрагменты SQL только там, где это необходимо . Фрагменты SQL явно поддерживаются, потому что создатели ActiveRecord
осознали, что SQL нельзя полностью абстрагировать.
Использование метода find
без фрагментов SQL обычно обеспечивает лучшую ремонтопригодность. В вашем примере попробуйте:
Book.find(:all,
:conditions => ["created_at >= ? AND created_at <= ? AND updated_at <= ?",
date1, date2, date3]
:include => :carts)
: inlude =>: carts
выполнит соединение, если вы добавили has_many: carts
в свою модель Book
. Как видите, не требуется много SQL. Даже кавычки и экранирование ввода можно оставить Rails, при этом все еще используя литералы SQL для обработки операторов > =
и <=
.
Пойдем немного дальше, вы можно сделать это еще яснее:
class Book < AciveRecord::Base
# Somewhere in your Book model:
named_scope :created_between, lambda { |start_date, end_date|
{ :conditions => { :created_at => start_date..end_date } }
}
named_scope :updated_before, lambda { |date|
{ :conditions => ["updated_at <= ?", date] }
}
# ...
end
Book.created_between(date1, date2).updated_before(date3).find(:all,
:include => :carts)
Обновление: суть named_scope
s, конечно же, в повторном использовании условий. Вам решать, имеет ли смысл помещать набор условий в именованную область видимости или нет.
has_many: carts
в свою модель Book
. Как видите, не требуется много SQL. Даже кавычки и экранирование ввода можно оставить Rails, при этом все еще используя литералы SQL для обработки операторов > =
и <=
.
Пойдем немного дальше, вы можно сделать это еще яснее:
class Book < AciveRecord::Base
# Somewhere in your Book model:
named_scope :created_between, lambda { |start_date, end_date|
{ :conditions => { :created_at => start_date..end_date } }
}
named_scope :updated_before, lambda { |date|
{ :conditions => ["updated_at <= ?", date] }
}
# ...
end
Book.created_between(date1, date2).updated_before(date3).find(:all,
:include => :carts)
Обновление: суть named_scope
s, конечно же, в повторном использовании условий. Вам решать, имеет ли смысл помещать набор условий в именованную область видимости или нет.
has_many: carts
в свою модель Book
. Как видите, не требуется много SQL. Даже кавычки и экранирование ввода можно оставить Rails, при этом все еще используя литералы SQL для обработки операторов > =
и <=
.
Пойдем немного дальше, вы можно сделать это еще яснее:
class Book < AciveRecord::Base
# Somewhere in your Book model:
named_scope :created_between, lambda { |start_date, end_date|
{ :conditions => { :created_at => start_date..end_date } }
}
named_scope :updated_before, lambda { |date|
{ :conditions => ["updated_at <= ?", date] }
}
# ...
end
Book.created_between(date1, date2).updated_before(date3).find(:all,
:include => :carts)
Обновление: суть named_scope
s, конечно же, в повторном использовании условий. Вам решать, имеет ли смысл помещать набор условий в именованную область видимости или нет.
> =
и <=
.
Если пойти немного дальше, вы можете сделать это еще яснее:
class Book < AciveRecord::Base
# Somewhere in your Book model:
named_scope :created_between, lambda { |start_date, end_date|
{ :conditions => { :created_at => start_date..end_date } }
}
named_scope :updated_before, lambda { |date|
{ :conditions => ["updated_at <= ?", date] }
}
# ...
end
Book.created_between(date1, date2).updated_before(date3).find(:all,
:include => :carts)
Обновление: суть named_scope
s, конечно же, повторное использование условий. Вам решать, имеет ли смысл помещать набор условий в именованную область видимости или нет.
> =
и <=
.
Если пойти немного дальше, вы можете сделать это еще яснее:
class Book < AciveRecord::Base
# Somewhere in your Book model:
named_scope :created_between, lambda { |start_date, end_date|
{ :conditions => { :created_at => start_date..end_date } }
}
named_scope :updated_before, lambda { |date|
{ :conditions => ["updated_at <= ?", date] }
}
# ...
end
Book.created_between(date1, date2).updated_before(date3).find(:all,
:include => :carts)
Обновление: суть named_scope
s, конечно же, повторное использование условий. Вам решать, имеет ли смысл помещать набор условий в именованную область видимости или нет.
Как molf говорит с помощью: include, .find () имеет преимущество в виде быстрой загрузки дочерних элементов. Кроме того, есть несколько плагинов, таких как разбиение на страницы, которые оборачивают функцию поиска. Вам нужно будет использовать .find () для использования плагинов.
Если у вас действительно сложный sql-запрос, помните, что .find () использует вашу точную строку параметров. Вы всегда можете ввести свой собственный sql-код:
: conditions => ["id in union (select * from table ...
] И не забывайте, что есть много необязательных параметров для .find ()
src: http: // api. rubyonrails.org/classes/ActiveRecord/Base.html#M002553[1230 impression