Grails: уровень предприятия [закрытый] Grails

Вы наткнулись на что-то сложное: обновление глубоко вложенной записи.

Для записей у вас есть получателей , поэтому #fname (#name (#p employee)) получает поле, по которому вы проверяете, чтобы узнать, что это сотрудник, фамилию которого вы собираетесь обновить. Но записи не предоставляют вам эквивалентных сеттеров , поэтому вы должны их создать. Если вам интересно, линзы (Haskell) - это общий способ решения этой проблемы, но я не знаю какой-либо реализации линз для Standard ML.

Я пойду дальше и удалю часть list в вашем типе employee; вам, вероятно, нужно хотеть employee list, если вы хотите, чтобы несколько сотрудников моделировались, вместо того, чтобы говорить, что сотрудник - это несколько человек.

type person_name = { fname:string, lname:string, mname:string }
type person_bio = { age:real, gender:string, name:person_name, status:string }
type employee = { p:person_bio, payrate:real, whours:real }

val name1 = { fname = "John", lname = "Doe", mname = "W." } : person_name
val bio1 = { age = 42.0, gender = "M", name = name1, status = "?" } : person_bio
val my_employee1 = { p = bio1, payrate = 1000.0, whours = 37.0 } : employee

val name2 = { fname = "Freddy", lname = "Mercury", mname = "X." } : person_name
val bio2 = { age = 45.0, gender = "M", name = name2, status = "?" } : person_bio
val my_employee2 = { p = bio2, payrate = 2000.0, whours = 37.0 } : employee

val my_employees = [ my_employee1, my_employee2 ] : employee list

Что касается сеттеров (те, которые вы можете автоматически получить с помощью объективов ),

fun setP (p : person_bio, e : employee) =
    { p = p
    , payrate = #payrate e
    , whours = #whours e } : employee

fun setName (name : person_name, pb : person_bio) =
    { age = #age pb
    , gender = #gender pb
    , name = name
    , status = #status pb } : person_bio

fun setLname (lname, pn : person_name) =
    { fname = #fname pn
    , lname = lname
    , mname = #mname pn } : person_name

, вы можете составить их, например, например:

- setP (setName (setLname ("Johnson", #name (#p my_employee1)), #p my_employee1), my_employee1)
> val it =
    {p =
           {age = 42.0, gender = "M",
            name = {fname = "John", lname = "Johnson", mname = "W."},
            status = "?"}, payrate = 1000.0, whours = 37.0} :
      {p :
         {age : real, gender : string,
          name : {fname : string, lname : string, mname : string},
          status : string}, payrate : real, whours : real}

Или вы можете немного разбить эту строку, чтобы сделать ее более читабельной:

fun updateLname (fname, lname, employees) =
    let fun update employee =
            if #fname (#name (#p employee)) = fname
            then let val new_name = setLname (lname, #name (#p employee))
                     val new_bio = setName (new_name, #p employee)
                     val new_employee = setP (new_bio, employee)
                 in new_employee end
            else employee
    in List.map update employees
    end

Попробовать это:

- updateLname ("Freddy", "Johnson", my_employees);
> val it =
    [{p = ... {fname = "John", lname = "Doe", mname = "W."}, ... },
     {p = ... {fname = "Freddy", lname = "Johnson", mname = "X."}, ... }]

- updateLname ("John", "Johnson", my_employees);
> val it =
    [{p = ... {fname = "John", lname = "Johnson", mname = "W."}, ... },
     {p = ... {fname = "Freddy", lname = "Mercury", mname = "X."}, ... }]

25
задан ThinkingStiff 3 August 2012 в 09:17
поделиться

3 ответа

Взгляните на Истории успеха Grails . Самые популярные сайты могут быть: Sky.com и mp3.walmart.com

27
ответ дан deamon 28 November 2019 в 21:23
поделиться

Если вы выполняете математику, 10 000 посещений в день - это менее одного попадания в секунду, даже если все 10 000 обращений происходили в течение 3-часового окна «пикового трафика». Даже если предположить, что вы имели в виду «рендеринг страниц», а не хиты, вы говорите о действительно незначительном объеме трафика.

5
ответ дан Tim Howland 28 November 2019 в 21:23
поделиться

В Groovymag есть хорошая информация об этом, но стоимость одного выпуска составляет $5. В этом выпуске есть интервью с парнем из Sky, который является очень большим сайтом, использующим Grails, а также информация по реализации сайта электронной коммерции с использованием Grails. Главное, что я понял, прочитав интервью одного из разработчиков sky.com, это то, что они без проблем масштабируются до миллионов просмотров страниц за счет грамотного использования кэширования. Хотя ваш сайт может иметь 10000 просмотров в день, большинство из этих просмотров не должны обращаться к базе данных. Вы можете кэшировать информацию о каждом доступном продукте, чтобы ограничить количество запросов, необходимых при просмотре сайта. Это должно снизить нагрузку на базу данных и сделать GORM менее узким местом. Мне не удалось выяснить, как работает GORM при высокой нагрузке, но если будет хуже, вы можете написать критичный к производительности код базы данных, используя чистые вызовы JDBC, и поместить его в сервис.

6
ответ дан 28 November 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: